![]() |
|
|
|||||||
| Netzwerkprogrammierung Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.) |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Neuer Benutzer
Bit
Registriert seit: 04.11.2003
Fachbeiträge: 1
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Hallo,
wenn ich ein ServerSocket erstelle und sich ein Client verbindet, möchte ich solange Nachrichten des Clients auslesen, bis die Verbindung clientseitig geschlossen wird. Nur weiß ich nicht, wie der Server erfahren kann, ob eine Verbindung geschlossen wurde. Hier mein Codeausschnitt: Server: Code:
try{
ServerSocket server = new ServerSocket(6000);
int count=0;
while(true)
{
System.out.println("Server wurde gestartet (Port "+server.getLocalPort()+")");
Socket socket = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientwrite="";
while(!clientwrite.equalsIgnoreCase("bye"))
{
clientwrite = in.readLine();
System.out.println("Client sagt: "+clientwrite);
}
in.close();
socket.close();
}
}catch(Exception e)
{
System.out.println("Fehler");
}
Code:
try
{
Socket client = new Socket("localhost",6000);
//OutputStream out = client.getOutputStream();
//OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
writer.write("test\n");
writer.write("bye\n");
writer.close();
client.close();
}catch(Exception e)
{
System.err.println("Fehler: "+e.getMessage());
}
Code:
while(!clientwrite.equalsIgnoreCase("bye"))
Code:
client.close() Code:
!socket.isClosed() Code:
socket.isConnected() Wie kriege ich das hin? Vielen Dank ![]() MfG gilioner |
|
|
| #3 (permalink) | |
|
Neuer Benutzer
byte
Registriert seit: 12.08.2003
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
ServerSocket definiert keine Methode isConnected(). Außerdem wäre das in diesem Fall sinnlos, da nur der Server selbst seinen eigenen Socket schließen kann. Er möchte viel mehr wissen, wie er herausbekommt, ob der Client seine Verbindung geschlossen hat.
Ich programmiere einen Chat und zerbreche mir jetzt seit knapp einem Jahr den Kopf über dieses Problem. Ich habe es auch mit den Methoden isClosed() usw. probiert, aber das geht nicht, da diese nur lokale Veränderungen anzeigen (wenn man z.B. Socket.close() aufruft). Es scheint so, als ob man dem Client etwas senden muss, um zu prüfen, ob die Verbindung noch besteht. Wenn beim Aufruf von write() eine Exception auftritt, dann wurde die Verbindung abgeschlossen. Allerdings habe ich schon Chatsysteme gesehen, die das anders lösen, nur bin ich bisher nicht dahintergekommen, wie. |
|
|
| #5 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 17.11.2003
Fachbeiträge: 4.827
Abgegebene Danke: 21
Erhielt 209 Danke für 187 Beiträge
|
Mir ist keine Möglichkeit bekannt direkt am Socket benachrichtigt zu werden, wenn die Gegenseite den eigenen Socket schließt. Da diese Möglichkeit meines Kenntnisstandes nicht existiert, bleiben folgende (vielleicht weitere) Alternativen:
* Bidirektionale Kommunikation zwischen Client und Server. Regelmäßige Abfrage des Clients vom Server aus (Request-Response). * Stream-close-signature (z.B. "bye"-string) und timeout, wobei dann besser ein ordentlich definitiertes und implementiertes Protokoll genutzt werden sollte. * Kombination aus 1 und 2 (sehr oft zweckmäßig) Was anderes fällt mir nicht ein. Grüße Ebenius[/code] |
|
|
| #6 (permalink) | |
|
Neuer Benutzer
byte
Registriert seit: 12.08.2003
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Es gibt eine Möglichkeit ohne irgendwelche "Pings": Die Methode SocketInputStream.read() wirft eine IOException, sobald die Gegenseite die Verbindung (sauber) schließt. Eigentlich sollte dein BufferedReader dies auch tun. Deswegen wäre es besser, die zweite Endlosschleife in einen try-Block zu packen.
Ich nutze dieses Prinzip in abgewandelter Form jetzt auch bei meinem Chat. |
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| einfache Frage zu Klassen | Spin | Java Basics - Anfänger-Themen | 12 | 03.12.2008 14:08 |
| Frage zu Serversocket-Beispiel aus der FAQ | Netzwerkprogrammierung | 17 | 15.07.2008 15:05 | |
| Einfache Frage zur Mehrfachvererbung | alipkp | Java Basics - Anfänger-Themen | 3 | 26.05.2007 12:53 |
| MVC-einfache frage | lucci | Java Basics - Anfänger-Themen | 13 | 09.11.2004 16:42 |
| ServerSocket prinzipielle Frage | akira | Netzwerkprogrammierung | 5 | 20.06.2004 18:33 |
| Lesezeichen |
|
|