[java] RMI en compressie

Pagina: 1
Acties:

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Het doel lijkt eenvoudig: Wat ik wil is RMI over compressed sockets. De uitvoering is blijkbaar wat ingewikkelder.

Nu gebruik ik al een eigen SocketFactory om communicatie door de firewall mogelijk te maken (d.m.v het gebruik van een enkele ServerSocket poort). Het lijkt dan ook redelijk eenvoudig om wat wrappers te schrijven voor Gzip(Server)Sockets en deze dan te gebruiken.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class GzipSocket extends Socket {
    private InputStream in = null;
    private OutputStream out = null;
    
    public GzipSocket() throws IOException {
        super(); 
    }

    public GzipSocket(String host, int port)throws IOException {
        super(host, port);
    }
    
    public synchronized InputStream getInputStream() throws IOException {
        if (in == null) {
            in = new ZipInputStream(super.getInputStream());
        }
        return in;
    }

    public synchronized OutputStream getOutputStream() throws IOException {
        if (out == null) {
            out = new ZipOutputStream(super.getOutputStream());
        }
        return out;
    }
    
    public synchronized void close() throws IOException {
        OutputStream o = getOutputStream();
        o.flush();
        super.close();
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class GzipServerSocket extends ServerSocket {
     
    public GzipServerSocket(int port) throws IOException {
        super(port);
    }
    
    public Socket accept() throws IOException {
        Socket s = new GzipSocket();
        implAccept(s);
        return s;
    }
    
}


En deze socketFactory:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class SingleSocketFactory extends RMISocketFactory implements Serializable {

    private int defaultPort;
    
    public SingleSocketFactory(int port) throws IOException {
        defaultPort = port;
    }

    public Socket createSocket(String host, int port) throws IOException{
        return new GzipSocket(host,port);
    }
   
    public ServerSocket createServerSocket(int port) throws IOException {
        return new GzipServerSocket(defaultPort);
    }

    public boolean equals(Object obj){
        return obj instanceof SingleSocketFactory;
    }

    public int hashCode(){
       return getClass().toString().hashCode();
   }
}


Maar helaas, dit werkt niet :( . De cleint blijft gewoon hangen en geeft een read timeout na enkele tientalle seconden. Vreemd genoeg is op internet ook niet veel info te vinden. Wel een vergelijkbaar voorbeeld met een ZipStream, maar dat werkt voorbeeld werkt evenmin. Er is ook een voorbeeld van SUN, maar dat is ook niet echt bruikbaar in real life. Ik heb ook nog dit getest, maar het brengt een berg dependancies met zich mee, en werkte uiteindelijk ook niet (kwam wel verder dan mijn eigen Gzip probeersel).

Waar ik dus eigenlijk naar op zoek ben zijn wrappers voor zowel server- als clientsocket, welke volledig transparant zijn voor de bovenliggende applicatie.

Ik hoop dat jullie me hiermee kunnen helpen. Andere tips zijn natuurlijk ook welkom.

Do diamonds shine on the dark side of the moon :?


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

Heb je hier misschien wat aan: http://www.javaworld.com/...12/01-qa-1207-ziprmi.html :?

Lijkt erg op wat je nu hebt, alleen op een paar punten net even anders :)

Neem je whisky mee, is het te weinig... *zucht*


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Dat bedoel ik dus, die gebruikt ZIP ;) En nee, dat werkt niet :P

Ik ga nu nog deflate proberen...

Edit: die werkt ook niet (zoals verwacht eigenlijk), zelfde trace als gzip

code:
1
2
3
4
5
6
7
8
9
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
        java.net.SocketTimeoutException: Read timed out
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:273)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
        at $Proxy0.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Naming.java:84)



Het probleem ligt natuurlijk voor de hand: Om de compressie effectief te laten zijn heb je wat data nodig. Als er te weinig is zal er wel niets over de lijn gaan, ongeacht of er nu geflushed wordt of niet...

Ik denk dat ik hier wat aan ga hebben: http://javatechniques.com...pressing-socket-data.html

[ Voor 115% gewijzigd door voodooless op 28-02-2007 14:39 ]

Do diamonds shine on the dark side of the moon :?


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

voodooless schreef op woensdag 28 februari 2007 @ 14:25:
Dat bedoel ik dus, die gebruikt ZIP ;) En nee, dat werkt niet :P
oh, ok :P
Ik denk dat ik hier wat aan ga hebben: http://javatechniques.com...pressing-socket-data.html
Dat ziet er wel goed uit idd :)

Neem je whisky mee, is het te weinig... *zucht*


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Hmm, zelfd dit lijkt niet te werken...

code:
1
2
3
4
5
6
7
8
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
        java.io.EOFException
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:273)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
        at $Proxy1.register(Unknown Source)


Vreemd genoeg werkt dat demo proggie wel... Ik ga het nog eens flink onder de loep nemen!

[ Voor 6% gewijzigd door voodooless op 28-02-2007 15:51 ]

Do diamonds shine on the dark side of the moon :?