Ich habe RMI + SSL eingerichtet. Das funktioniert großartig. Es scheint jedoch nicht möglich zu sein, die Komprimierung zwischen RMI und SSL zu verschieben. Damit die RMI-Anforderungen komprimiert werden, bevor sie über SSL gesendet werden.
Ich habe einige Posts im Internet gesehen, die vorschlagen, dass SSLSocketFactory.createSocket()
einen Socket verwendet, um SSL über einen komprimierenden Socket zu übertragen. Aber das scheint so zu sein, als würde es versuchen, das SSL-Protokoll selbst zu komprimieren, das wahrscheinlich nicht sehr komprimierbar ist.
Ich sollte einen Socket
-proxy erstellen (Unterklasse von Socket
, die auf ein anderes Socket
verweist, wie FilterOutputStream
). Lassen Sie den Proxy die Input / Output-Streams mit Komprimierung umschließen. Und meine SocketFactory
und ServerSocketFactory
geben die Proxies zurück und wickeln die SSLSocket
ein.
Aber dann haben wir das Pufferproblem. Die Komprimierung puffert die Daten, bis sie ausreichend komprimiert werden können, oder sie werden angewiesen, zu spülen. Dies ist in Ordnung, wenn Sie keine Hin-und-Her-Kommunikation über den Socket haben. Aber mit zwischengespeicherten Sockets in RMI haben Sie das. Es gibt keine Möglichkeit, das Ende einer RMI-Anforderung zu identifizieren, sodass Sie Ihre komprimierten Daten löschen können.
Sun hat ein RMISocketFactory
-Beispiel, das so etwas tut, aber das überhaupt nicht anspricht.
Notizen:
1. SSL unterstützt die Komprimierung, aber ich kann nichts über die Aktivierung in JSSE finden
2. Ich weiß, dass die Komprimierung auf viele kleine nicht zusammenhängende Blöcke (wie RMI normalerweise besteht) nicht sehr vorteilhaft ist
3. Ich weiß, dass RMI nicht die beste Wahl ist, wenn ich große Anfragen sende
4. Es gibt ein SSLRMISocketFactory
in Java 6. Aber es fügt nichts über meine benutzerdefinierte Implementierung hinzu.
Ich habe RMI + SSL eingerichtet. Das funktioniert großartig. Es scheint jedoch nicht möglich zu sein, die Komprimierung zwischen RMI und SSL zu verschieben. Damit die RMI-Anforderungen komprimiert werden, bevor sie über SSL gesendet werden.
Ich habe einige Posts im Internet gesehen, die vorschlagen, dass Socket
einen Socket verwendet, um SSL über einen komprimierenden Socket zu übertragen. Aber das scheint so zu sein, als würde es versuchen, das SSL-Protokoll selbst zu komprimieren, das wahrscheinlich nicht sehr komprimierbar ist.
Ich sollte einen SocketImpl
-proxy erstellen (Unterklasse von StreamPair
, die auf ein anderes RMISocketFactory
verweist, wie wrap
). Lassen Sie den Proxy die Input / Output-Streams mit Komprimierung umschließen. Und meine wrap
und wrap
geben die Proxies zurück und wickeln die Socket
ein.
Aber dann haben wir das Pufferproblem. Die Komprimierung puffert die Daten, bis sie ausreichend komprimiert werden können, oder sie werden angewiesen, zu spülen. Dies ist in Ordnung, wenn Sie keine Hin-und-Her-Kommunikation über den Socket haben. Aber mit zwischengespeicherten Sockets in RMI haben Sie das. Es gibt keine Möglichkeit, das Ende einer RMI-Anforderung zu identifizieren, sodass Sie Ihre komprimierten Daten löschen können.
Sun hat ein isConnected
-Beispiel, das so etwas tut, aber das überhaupt nicht anspricht.
Notizen:
1. SSL unterstützt die Komprimierung, aber ich kann nichts über die Aktivierung in JSSE finden
2. Ich weiß, dass die Komprimierung auf viele kleine nicht zusammenhängende Blöcke (wie RMI normalerweise besteht) nicht sehr vorteilhaft ist
3. Ich weiß, dass RMI nicht die beste Wahl ist, wenn ich große Anfragen sende
4. Es gibt ein true
in Java 6. Aber es fügt nichts über meine benutzerdefinierte Implementierung hinzu.
Tags und Links java ssl rmi rpc compression