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.
En deze socketFactory:
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.
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
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 :?