package elte.java2_utikalauz5.rmi; import java.io.*; import java.net.*; import java.rmi.server.*; /** Negáló bemeneti adatfolyam. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegInputStream extends FilterInputStream { public NegInputStream(InputStream in) { super(in); } public int read() throws IOException { // Beolvasunk egy byte-ot int b=in.read(); return ( b == -1 ) ? -1 : 256 - b; // és visszaadjuk a negáltját } public int read(byte b[], int off, int len) throws IOException { int hossz = in.read(b, off, len); // Több byte beolvasása és negálása for(int i = 0; i < hossz; ++i) b[off + i] = (byte)( 256 - b[off + i] ); return hossz; } } /** Negáló kimeneti adatfolyam. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegOutputStream extends FilterOutputStream { public NegOutputStream(OutputStream out) { super(out); } public void write(int b) throws IOException {// Kiírjuk az elküldendő üzenet out.write(256 - b); out.flush();// következő byte-ját negálva } public void write(byte b[], int off, int len) throws IOException { for (int i = 0; i < len; ++i) out.write((byte)(256-b[off + i])); out.flush(); // Több byte negált kiírása } } /** Negáló hálózati végpont. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegVegpont extends Socket { private InputStream in = null; // A socketünkben használt be- private OutputStream out = null; // és kimeneti csatorna public NegVegpont() throws IOException {} public NegVegpont(String host, int port) throws IOException { super(host, port); } public InputStream getInputStream() throws IOException { if (in==null) in = new NegInputStream(super.getInputStream()); return in; //csatorna lekérdezése: ha még nincs, létrehozzuk } public OutputStream getOutputStream() throws IOException { if (out == null) out = new NegOutputStream(super.getOutputStream()); return out; //csatorna lekérdezése: ha még nincs, létrehozzuk } } /** Negáló kliensoldali végpontgenerátor. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegKliensVegpontGenerator implements RMIClientSocketFactory, Serializable { /** Verziószám. */ private final static long serialVersionUID = 15L; public NegKliensVegpontGenerator() {} public Socket createSocket(String host, int port) throws IOException { return new NegVegpont(host, port); } public int hashCode() { return getClass().hashCode(); } public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; return true; } } /** Negáló szerveroldali végpontgenerátor. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegSzerverVegpontGenerator implements java.rmi.server.RMIServerSocketFactory { public NegSzerverVegpontGenerator() {} public java.net.ServerSocket createServerSocket(int port) throws java.io.IOException{ return new NegServerSocket(port); }// hashCode, equals mint előbb public int hashCode() { return getClass().hashCode(); } public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; return true; } } /** Negáló szerveroldali végpont. @link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @since Java 2 Útikalauz programozóknak 5.0 */ class NegServerSocket extends java.net.ServerSocket { public NegServerSocket(int port) throws java.io.IOException { super(port); } public java.net.Socket accept() throws java.io.IOException { java.net.Socket s = new NegVegpont(); // Létrehozunk egy NegVegpont-et, implAccept(s); // majd elkezdünk fogadni rajta keresztül return s; } } /** Számláló szerver. Használatakor ne feledjünk el a következő jogokat megadni!
grant signedBy "utikalauz" {
    permission java.net.SocketPermission "*:1024-", "connect,accept";
};
@link.forrásfájl {@docRoot}/../data/rmi/src NSzerver.java @link.letöltés {@docRoot}/../data/rmi NSzerver.jar @since Java 2 Útikalauz programozóknak 5.0 */ public class NSzerver implements Szamlalo { private int számláló; public NSzerver() { számláló = 0; } public int számlál() { return ++számláló; } public static void main(String paraméter[]) { if (System.getSecurityManager() == null) System.setSecurityManager( new SecurityManager()); try { // Létrehozzuk a távoli objektumunkat, amely az általunk NSzerver szerver = new NSzerver(); //tervezett generátorokat használja RMIClientSocketFactory csf = new NegKliensVegpontGenerator(); RMIServerSocketFactory ssf = new NegSzerverVegpontGenerator(); Szamlalo szerverCsonk = (Szamlalo) UnicastRemoteObject.exportObject( szerver, 0, csf, ssf); // Bejegyeztetjük egy új névjegyzékbe java.rmi.registry.LocateRegistry.createRegistry(34567); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry(34567); registry.rebind("Számláló", szerverCsonk); System.out.println("A szerver készen áll."); } catch (Exception e) { System.out.println("Szerverhiba: " + e.getMessage()); e.printStackTrace(); } } }