Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

1 Zum Seitenanfang

Montag, 20. April 2009, 15:02

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?
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

2 Zum Seitenanfang

Montag, 20. April 2009, 17:55

Ja, natürlich funktioniert das.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

3 Zum Seitenanfang

Montag, 20. April 2009, 18:35

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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (20. April 2009, 18:35)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

4 Zum Seitenanfang

Dienstag, 21. April 2009, 07:29

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 ):

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
 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

5 Zum Seitenanfang

Dienstag, 21. April 2009, 09:34

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
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

6 Zum Seitenanfang

Dienstag, 21. April 2009, 18:42

@ 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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (21. April 2009, 18:42)

 

heinervdm

Technik-Admin

Dabei seit: 02.10.2002

Beiträge: 3 772

 

7 Zum Seitenanfang

Mittwoch, 22. April 2009, 08:38

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.
 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

8 Zum Seitenanfang

Mittwoch, 22. April 2009, 08:54

@ 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.
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

9 Zum Seitenanfang

Mittwoch, 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.

@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)

 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

10 Zum Seitenanfang

Mittwoch, 22. April 2009, 15:41

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.
 

Ähnliche Themen