java socket - Input -OutputStream mehrfach verwenden
blöde Frage zu Sockets:
kann eigentlich ein Output - und InputStream von einem socket mehrfach verwendet werden?
(es geht um client sockets - klar, oder?)
In fast allen Beispielen und Anwendungen, die ich gesehen habe, läuft das ganze ja in etwa so ab:
- Socket erstellen
- Input-und OutputStream vom Socket holen
- in den Outputstream schreiben (Anfrage an den Server)
- Antwort des Servers über den InputStream abholen
- InputStream schließen
- OutputStream schließen
- Socket schließen
fertig.
Könnte man prinzipiell, wenn genau dieser Input - und OutputStream des Sockets nicht geschlossen werden,
- weitere Anfragen über genau diesen OutputStream an den Server senden
und
- weitere Antworten über genau diesen InputStream empfangen?
kann eigentlich ein Output - und InputStream von einem socket mehrfach verwendet werden?
(es geht um client sockets - klar, oder?)
In fast allen Beispielen und Anwendungen, die ich gesehen habe, läuft das ganze ja in etwa so ab:
- Socket erstellen
- Input-und OutputStream vom Socket holen
- in den Outputstream schreiben (Anfrage an den Server)
- Antwort des Servers über den InputStream abholen
- InputStream schließen
- OutputStream schließen
- Socket schließen
fertig.
Könnte man prinzipiell, wenn genau dieser Input - und OutputStream des Sockets nicht geschlossen werden,
- weitere Anfragen über genau diesen OutputStream an den Server senden
und
- weitere Antworten über genau diesen InputStream empfangen?
Vielen Dank für deine Antwort ... hmm und Mist für mich.
Wollte einen http- socket nutzen, um das, was bisher in einer Anwendung über ein anwendungseigenes binäres Protokoll und einen einfachen tcp/ip-socket läuft, in HTTP-Post's wrappen und an einen Webserver zu senden. Der OutputStream wäre dann halt mit der Antwort des Webservers gefüllt worden. Aber so wird das ja nochmal um einiges kniffliger.
Wollte einen http- socket nutzen, um das, was bisher in einer Anwendung über ein anwendungseigenes binäres Protokoll und einen einfachen tcp/ip-socket läuft, in HTTP-Post's wrappen und an einen Webserver zu senden. Der OutputStream wäre dann halt mit der Antwort des Webservers gefüllt worden. Aber so wird das ja nochmal um einiges kniffliger.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (20. April 2009, 18:35)
Wieso denn?
Du kannst natürlich gerne den sockelt schließen und immer wieder neue machen, gleiches gilt für die Streams.
Letzten endes kann es dann so ablaufen ( Pseudocode ):
Du kannst natürlich gerne den sockelt schließen und immer wieder neue machen, gleiches gilt für die Streams.
Letzten endes kann es dann so ablaufen ( Pseudocode ):
|
|
Quellcode |
1 2 |
if ( mystream.GetNewByteCount() > 0 )
mystream.Read( myStream.GetNewByteCount(), variable );
|
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
also wenn du httpURLConnection verwendest, dann sollte das auch genau so ablaufen.
da stellt der client eine anfrage, der server antwortet und schließt automatisch die verbindung wieder.
dann musst du eine neue verbindung zum server aufbauen.
ich denke mal wenn du das via http machst, ist es sinnlos den socket offen zu halten, da der server ohnehin nicht mehr darauf reagieren wird.
jperl
da stellt der client eine anfrage, der server antwortet und schließt automatisch die verbindung wieder.
dann musst du eine neue verbindung zum server aufbauen.
ich denke mal wenn du das via http machst, ist es sinnlos den socket offen zu halten, da der server ohnehin nicht mehr darauf reagieren wird.
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
@ jperl
( Edit) so habe ich httpConnections bisher auch genutzt.
Wenn ich das richtig verstehe, laufen httpConnections mit presistenten HTTP1/1 - Verbindungen durchaus intern über eine Mehrfachverwendung des selben Sockets zum Webserver. Oder verstehe ich hier etwas völlig falsch? http://java.sun.com/j2se/1.5.0/docs/guid…-keepalive.html
Darum dachte ich, ich könnte mit einem eigenem http-socket einen webserver mehrfach abfragen, aber bisher geht das irgendwie auch nicht. Egal - ist nicht das wichtige Problem bei der Sache.
@silence
Ja, ich weiß, dass ich die Sockets schließen und neu eröffnen könnte. Ich habe jetzt nur das Problem, erkennen zu müssen, wann ein neuer socket geöffnet (ein neuer Request an den Server gesendet) werden muss. Das ist für mich in der fremden Anwendung nicht ganz so einfach zu erkennen. Sie nutzen den OutputStream des orginalen Sockets scheinbar in etlichen Klassen (wenn ich deren Quelltext richtig verstehe), um irgendwann etwas hineinzuschreiben. Alle diese Situationen muß ich ja nun in getrennte Requests verpacken und separat senden. Ursprünglich wollte ich hauptsächlich nur die Socketimplementierung auswechseln und die restlichen Klassen so belassen, wie sie sind.
Aber das geht nun nicht so einfach, es sei denn ich tausche den OutputStream und InputStream gegen eine eigene Version. Dann müßte ich aber eine Art Paketparser unter meinem OutputStream implementieren, der erkennt, wann ein Paket zum versenden fertig ist und in einen http-Request gepackt werden muß. Die Antwort des Webservers müßte ich nun von hinten herum wieder in den von der Anwendung verwendeten InputStream schreiben. Alles nicht ganz so einfach, glaube ich
( Edit) so habe ich httpConnections bisher auch genutzt.
Wenn ich das richtig verstehe, laufen httpConnections mit presistenten HTTP1/1 - Verbindungen durchaus intern über eine Mehrfachverwendung des selben Sockets zum Webserver. Oder verstehe ich hier etwas völlig falsch? http://java.sun.com/j2se/1.5.0/docs/guid…-keepalive.html
Darum dachte ich, ich könnte mit einem eigenem http-socket einen webserver mehrfach abfragen, aber bisher geht das irgendwie auch nicht. Egal - ist nicht das wichtige Problem bei der Sache.
@silence
Ja, ich weiß, dass ich die Sockets schließen und neu eröffnen könnte. Ich habe jetzt nur das Problem, erkennen zu müssen, wann ein neuer socket geöffnet (ein neuer Request an den Server gesendet) werden muss. Das ist für mich in der fremden Anwendung nicht ganz so einfach zu erkennen. Sie nutzen den OutputStream des orginalen Sockets scheinbar in etlichen Klassen (wenn ich deren Quelltext richtig verstehe), um irgendwann etwas hineinzuschreiben. Alle diese Situationen muß ich ja nun in getrennte Requests verpacken und separat senden. Ursprünglich wollte ich hauptsächlich nur die Socketimplementierung auswechseln und die restlichen Klassen so belassen, wie sie sind.
Aber das geht nun nicht so einfach, es sei denn ich tausche den OutputStream und InputStream gegen eine eigene Version. Dann müßte ich aber eine Art Paketparser unter meinem OutputStream implementieren, der erkennt, wann ein Paket zum versenden fertig ist und in einen http-Request gepackt werden muß. Die Antwort des Webservers müßte ich nun von hinten herum wieder in den von der Anwendung verwendeten InputStream schreiben. Alles nicht ganz so einfach, glaube ich
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (21. April 2009, 18:42)
Wenn du schon die gesamte Implementierung anfasst könntest du dir überlegen direkt auf Webservices umzusteigen. Dann könntest du einfache Java Boardmittel für alles nutzen.
Ü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.
@ jperl
( Edit) so habe ich httpConnections bisher auch genutzt.
Wenn ich das richtig verstehe, laufen httpConnections mit presistenten HTTP1/1 - Verbindungen durchaus intern über eine Mehrfachverwendung des selben Sockets zum Webserver. Oder verstehe ich hier etwas völlig falsch? http://java.sun.com/j2se/1.5.0/docs/guid…-keepalive.html
Darum dachte ich, ich könnte mit einem eigenem http-socket einen webserver mehrfach abfragen, aber bisher geht das irgendwie auch nicht. Egal - ist nicht das wichtige Problem bei der Sache.
das war mir nicht wirklich klar.
was im rfc 2068 für http 1.1 steht ist folgendes.
http://www.faqs.org/rfcs/rfc2068.html abschnitt 14.10
Zitat
HTTP/1.1 applications that do not support persistent connections MUST include the "close" connection option in every message.
somit könntest du meiner annahme nach mit setRequestProperty("Connection", "Close") erreichen, dass die verbindung nicht aufrechterhalten wird.
aber ka ob das so auch wirklich stimmt.
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Wollte ja in einem Versuch daraufhin genau das Gegenteil erreichen und mit einem socket ( nicht mit httpConnection) einen Webserver mehrfach über den gleichen OutputStream des Sockets abfragen.
Dazu habe ich ganz bewußt den HTTP-Header "Connection:keep-alive" unter HTTP1/1 gesetzt.
Erst wenn dieser Header gesetzt ist, antwortet der Webserver auch mit "Connection:keep-alive" nach der ersten Anfrage. Ansonsten schickt der Webserver immer ein "Connection:closed" mit seiner Antwort.
Die zweite Anfrage an den Webserver über den gleichen OutputStream bleibt jedoch irgendwie hängen. Da das aber absolut nicht das eigentliche Problem ist und war, habe ich nicht weiter gesucht, was da falsch läuft.
@heiner, jaein. Wäre sinnlos für das, was ich vorhatte. Ich wollte das interne MYSQL-Protokoll vom MYSQL Connector/J 5.1 an ein PHP Script leiten. So, wie ich das jetzt sehe, müßte das doch ( umfangreicher, als ürsprünglich gedacht) machbar sein. Im MYSQL Connector/J 5.1 gibt es eine Klasse Namens "com.mysql.jdbc.MysqlIO".Diese Klasse müßte mit einer eigenen Implementierung versehen werden. Der Rest müßten kleine Änderungen sein, wenn ich das jetzt richtig sehe.
Dazu habe ich ganz bewußt den HTTP-Header "Connection:keep-alive" unter HTTP1/1 gesetzt.
Erst wenn dieser Header gesetzt ist, antwortet der Webserver auch mit "Connection:keep-alive" nach der ersten Anfrage. Ansonsten schickt der Webserver immer ein "Connection:closed" mit seiner Antwort.
Die zweite Anfrage an den Webserver über den gleichen OutputStream bleibt jedoch irgendwie hängen. Da das aber absolut nicht das eigentliche Problem ist und war, habe ich nicht weiter gesucht, was da falsch läuft.
@heiner, jaein. Wäre sinnlos für das, was ich vorhatte. Ich wollte das interne MYSQL-Protokoll vom MYSQL Connector/J 5.1 an ein PHP Script leiten. So, wie ich das jetzt sehe, müßte das doch ( umfangreicher, als ürsprünglich gedacht) machbar sein. Im MYSQL Connector/J 5.1 gibt es eine Klasse Namens "com.mysql.jdbc.MysqlIO".Diese Klasse müßte mit einer eigenen Implementierung versehen werden. Der Rest müßten kleine Änderungen sein, wenn ich das jetzt richtig sehe.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ospx« (22. April 2009, 12:24)
Wollte ja in einem Versuch daraufhin genau das Gegenteil erreichen und mit einem socket ( nicht mit httpConnection) einen Webserver mehrfach über den gleichen OutputStream des Sockets abfragen.
Dazu habe ich ganz bewußt den HTTP-Header "Connection:keep-alive" unter HTTP1/1 gesetzt.
Erst wenn dieser Header gesetzt ist, antwortet der Webserver auch mit "Connection:keep-alive" nach der ersten Anfrage. Ansonsten schickt der Webserver immer ein "Connection:closed" mit seiner Antwort.
Die zweite Anfrage an den Webserver über den gleichen OutputStream bleibt jedoch irgendwie hängen. Da das aber absolut nicht das eigentliche Problem ist und war, habe ich nicht weiter gesucht, was da falsch läuft.
hmm, dass es intern zu einer mehrfachverwendung eines sockets kommt, kann wie der von dir gepostete link zeigt durchaus sein.
ich habs jedoch bis jetzt noch nie hingekriegt, den gleichen outputstream bei der anfrage an einen server wiederzuverwenden.
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Ähnliche Themen
-
Kleinanzeigen »-
[suche] mitarbeiter
(20. Januar 2009, 14:28)
-
Hardware »-
Welchen Lüfter?
(18. September 2007, 17:35)
-
Archiv: Betriebssysteme »-
DNS-Lookup (MX) liefert unerreichbare Sockets
(8. November 2006, 14:28)
-
PHP »-
sockets - timeout ??
(4. Mai 2006, 23:40)


