Java SocketImpl, SocketFactory
Irgendwie finde ich keine sonderlich guten Erklärungen oder Beispiele zur Verwendung von SocketImpl / SocketFactory etc.
Hat sich da schon jemand daran versucht?
Kann mir jemand ein simples Beispiel zur Verwendung von SocketImpl geben?
Es gibt einen Konstruktor unter Socket, der eine SocketImpl als Parameter übernimmt. In manchen Dokus ist dieser Konstruktor als protected gekennzeichnet, in anderen als public. Manche Dokumente besagen,man könne diesen Konstruktor (protected) nur in von Socket abgeleiteten Klassen intern verwenden. Andere Quellen sprechen von der Verwendung der SocketFactory mit dem Nachteil, dass ab da alle Sockets der Anwendung nur diese Socket-Implementierung nutzen würden. Ich brauche aber verschiedene Sockets parallel, zum Teil die eigene Implementierung, zum Teil die Standard-Implementierung.
Muß ich dafür nun eine Ableitung von der Klasse Socket schreiben oder geht das einfacher?
Am besten für mich wäre es, wenn ich einem Socket-Objekt meine SocketImpl mitgeben könnte und die restlichen Sockets normal verwendet werden könnten.
Ein Link zu einem guten Tut oder einem anschaulichem Beispiel würde mir auch sehr weiterhelfen.
Hat sich da schon jemand daran versucht?
Kann mir jemand ein simples Beispiel zur Verwendung von SocketImpl geben?
Es gibt einen Konstruktor unter Socket, der eine SocketImpl als Parameter übernimmt. In manchen Dokus ist dieser Konstruktor als protected gekennzeichnet, in anderen als public. Manche Dokumente besagen,man könne diesen Konstruktor (protected) nur in von Socket abgeleiteten Klassen intern verwenden. Andere Quellen sprechen von der Verwendung der SocketFactory mit dem Nachteil, dass ab da alle Sockets der Anwendung nur diese Socket-Implementierung nutzen würden. Ich brauche aber verschiedene Sockets parallel, zum Teil die eigene Implementierung, zum Teil die Standard-Implementierung.
Muß ich dafür nun eine Ableitung von der Klasse Socket schreiben oder geht das einfacher?
Am besten für mich wäre es, wenn ich einem Socket-Objekt meine SocketImpl mitgeben könnte und die restlichen Sockets normal verwendet werden könnten.
Ein Link zu einem guten Tut oder einem anschaulichem Beispiel würde mir auch sehr weiterhelfen.
ein sehr simples Beispiel wäre, wenn der Outputstream der eigenen Socket-Implementierung einfach in einem byte[]-Feld abgelegt würde oder über System.out.println() ausgegeben würde, anstatt tatsächlich versendet zu werden.
Es geht mir primär darum, wie ich die SocketImpl an den Socket übergebe oder wie ich mit SocketFactory umzugehen habe . Was der eigene Socket (die eigene SocketImpl) im Hintergrund tatsächlich macht, ist nicht das Problem.
Klar könnte ich die Klasse Socket auch ableiten und mind. alle öffentlichen Methoden in der Ableitung überschreiben. Das erscheint mir aber extrem aufwändig. Zumal es ja die Klasse SocketImpl genau dafür gibt. Nur ersehe ich nicht, was man mit seiner SocketImpl genau machen muß, um diese in einen Socket zu bekommen.
Link zur Doku des fraglichen Konstruktors protected Socket(SocketImpl)
edit: google codeSearch ist hilfreich
Es geht mir primär darum, wie ich die SocketImpl an den Socket übergebe oder wie ich mit SocketFactory umzugehen habe . Was der eigene Socket (die eigene SocketImpl) im Hintergrund tatsächlich macht, ist nicht das Problem.
Klar könnte ich die Klasse Socket auch ableiten und mind. alle öffentlichen Methoden in der Ableitung überschreiben. Das erscheint mir aber extrem aufwändig. Zumal es ja die Klasse SocketImpl genau dafür gibt. Nur ersehe ich nicht, was man mit seiner SocketImpl genau machen muß, um diese in einen Socket zu bekommen.
Link zur Doku des fraglichen Konstruktors protected Socket(SocketImpl)
edit: google codeSearch ist hilfreich
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ospx« (2. September 2009, 16:02)
Also ohne jetzt in die Doku geguckt zu haben, vermute ich jetzt, dass du dir eine Instance von SocketFactory holst und die dir den Socket liefert.
Ich gucke gleich mal in die Doku.
Edit:
Ok es ist nicht getInstance, sondern getDefault
Ich gucke gleich mal in die Doku.
Edit:
Ok es ist nicht getInstance, sondern getDefault

|
|
Quellcode |
1 |
SocketFactory.getDefault().createSocket(); |
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
So langsam bekomme ich eine Ahnung davon, wozu die einzelnen Klassen und Schnittstellen zu gebrauchen sind und welchen Sinn sie haben.
Schade, dass es dazu (zumindest auf den ersten Blick) keine übersichtliche 'Schritt für Schritt' -Erklärung oder übersichtliche Einführung gibt oder ich sie zumindest nicht gefunden habe.
die fraglichen Klassen:
Soweit ich das sehe, sind eigene Ableitungen von SocketImpl nur dann interessant, falls man alle(?) Sockets, die in einer Anwendung verwendet werden, verändern will.
Um eigene SocketImpl verwenden zu können, muß man(?) eine eigene Ableitung der Schnittstelle SocketImplFactory erstellen und am Anfang des Programms setzen. Diese SocketImplFactory nutzt dann die eigene SocketImpl, um bei Instanzierung von Sockets die eigene Implementierung anstatt der Standardimplementierung zurück zu geben. Diese eigene SocketImplFactory müßte dann das sein, was bei einem Aufruf von
zurückgegeben wird (??).
Braucht man verschiedene Sockets / Socketimplementierungen, läuft das dann wohl doch über das 'simple' Überschreiben der Socket-Klasse und deren jeweiliger Instanzierung je nach Bedarf im Programm oder über eine eigene Ableitung der SocketFactory.
Bin mir aber trotzdem noch sehr unsicher, ob ich das nun richtig verstanden habe. Wenn jemand sieht, dass ich hier einen gedanklichen Fehler drin habe, wäre ich für einen Hinweiß dankbar.
Schade, dass es dazu (zumindest auf den ersten Blick) keine übersichtliche 'Schritt für Schritt' -Erklärung oder übersichtliche Einführung gibt oder ich sie zumindest nicht gefunden habe.
die fraglichen Klassen:
- Socket (ist eigentlich klar)
- SocketImpl
- SocketImplFactory
- SocketFactory
Soweit ich das sehe, sind eigene Ableitungen von SocketImpl nur dann interessant, falls man alle(?) Sockets, die in einer Anwendung verwendet werden, verändern will.
Um eigene SocketImpl verwenden zu können, muß man(?) eine eigene Ableitung der Schnittstelle SocketImplFactory erstellen und am Anfang des Programms setzen. Diese SocketImplFactory nutzt dann die eigene SocketImpl, um bei Instanzierung von Sockets die eigene Implementierung anstatt der Standardimplementierung zurück zu geben. Diese eigene SocketImplFactory müßte dann das sein, was bei einem Aufruf von
|
|
Java-Quelltext |
1 |
SocketFactory.getDefault() |
zurückgegeben wird (??).
Braucht man verschiedene Sockets / Socketimplementierungen, läuft das dann wohl doch über das 'simple' Überschreiben der Socket-Klasse und deren jeweiliger Instanzierung je nach Bedarf im Programm oder über eine eigene Ableitung der SocketFactory.
Bin mir aber trotzdem noch sehr unsicher, ob ich das nun richtig verstanden habe. Wenn jemand sieht, dass ich hier einen gedanklichen Fehler drin habe, wäre ich für einen Hinweiß dankbar.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ospx« (3. September 2009, 14:36)
- SocketImpl: Eine abstrakte Klasse, d.h. man kann sie nicht direkt Benutzen, sondern braucht eine Subklasse davon. Sie ist so etwas wie eine Schnittstellendefinition, nur das ein paar Funktionen die für alle gleich sind bereits vor-implementiert sind.
- SocketImplFactory: Eine Factory Schnittstellendefinition, macht nichts weiter als Festzulegen was eine Implementierung an Methoden habe muss
- Socket: Eine Klasse die Sockets (clientseitig) repräsentiert. Sie benutzt die Standard Implementierung von SocketImpl um die eigentliche Arbeit zu machen.
- SocketFactory: Erstellt Sockets. Soweit ich es bisher raus gefunden habe nutzen sie SocksSocketImpl als default.
SocketImpl ist also auch dann interessant wenn man nur einen einzelnen besonderen Socket braucht. Die besondere Implementierung kann man an Socket beim Instantiieren übergeben.
Wenn man jetzt aber für alle Sockets, die über den parameterlosen Konstruktor von Socket erstellt werden, diese besondere Implementierung verwendet werden soll so kannst du über Socket.setSocketImplFactory eine Factory, welche die Schnittstelle SocketImplFactory Implementiert, übergeben.
Das übliche Default ist eine SocksSocketImpl, soweit ich es gefunden habe, die aber anscheinend aufgrund ihrer eher "internen" Natur nicht in der JavaDoc aufgeführt wird.
SocketFactory.getDefault() scheint auf die Rückgabe von DefaultSocketFactory hardcoded zu sein, wobei sich das auch evtl nur auf openjdk bezieht.
Insgesamt kann man wohl diesen Teil der Dokumentation als recht Irreführend bezeichnen. Wenn man aber nicht in den ganzen Factory Kram einsteigen möchte dann sind es nur zwei Sachen:
- eine Subklasse von SocketImpl macht die ganze Arbeit
- will man diese verwenden kann man es indem man dem Konstruktor von Socket beim Instantiieren eine Instanz davon übergibt.
ihre DNS Analyse zeigt eine krankhafte Abneigung gegen jegliche Autorität und einen Charakter der zum Gewaltausbrechen neigt....
Habe eine für mich gängige Lösung gefunden. Aber :
Das würde mich wundern, da eben jener Konstruktor, dem die SocketImpl übergeben werden kann, dummerweise protected ist, also eben nicht von außen ohne weiteres verwendet werden kann. Diesen Konstruktor kann man jedoch in (eigenen) Ableitungen von Socket nutzen.
Zitat
SocketImpl ist also auch dann interessant wenn man nur einen einzelnen
besonderen Socket braucht. Die besondere Implementierung kann man an
Socket beim Instantiieren übergeben.
Ähnliche Themen
-
Archiv: Software »-
Alles was mit Java zu tun hat funzt nich mehr!
(24. Dezember 2003, 22:19)
-
PHP »-
Verschlüsselungen
(3. August 2003, 16:32)
-
(X)HTML & CSS & DHTML & Javascript »-
Javascript funktioniert nicht
(30. Dezember 2002, 07:34)
-
Allgemeines Forum »-
Browser
(13. Dezember 2002, 23:11)


