Portal > Foren > Java > Allgemeine Java-Programmierung > Sockets: Verbindung prüfen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 07.10.2005, 11:37 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 07.10.2005
Beiträge: 23
Standard Sockets: Verbindung prüfen

Hallo zusammen
ich schlag mich gerade mit dem chatservercode rum den wahrscheinlich einige von euch schon zu gut kennen. ...deshalb mein verzweifeltes Posting

Das ganze läuft eigentlich wunderbar ....bis auf ein kleines Problem ...wie kann ich überprüfen ob die Socketverbindung vom client unerwartet (also nicht routinemässig) geschlossen oder besser einfach sein gelassen wird.
Eigentlich sollte solche fälle doch mit "catch" abfangen können oder nicht?
"DataInputStream(bzw. in) == null" funktioniert leider auch nicht!

try
{
while(true)
{
Hier müsste ich überprüfen können ob der Client noch da ist, ...wenn nicht Schleife verlassen Thread beenden.
line=in.readLine();
if(line!=null)
server.broadcast(line);
}
} catch (IOException e)
{
System.out.println("Fehler:" + e);
}
Danke schon mal für Input jeglicher Art.
ich hab den kompletten Code der Vollständikeit halber hier unten noch reingepostet.

Die Frage ist eigentlich jedoch nur: Wie kann man überprüfen ob der Client der Socketverbindung eingegangen ist, den Socket aufrechterhält.

für newbie- und schon 100mal gestellte fragen bitte ich höfflichst um vergebung :rolleyes:

Server-Klasse
import java.net.*;
import java.io.*;
import java.util.*;

public class chatserver implements Runnable
{
public static final int PORT = 8765;
protected ServerSocket listen;
protected Vector connections;
Thread connect;

public static void main(String[] args)
{
new chatserver();
}

public chatserver()
{
try
{
listen = new ServerSocket(PORT);
} catch (IOException e)
{
System.out.println("Fehler beim Erzeugen der Sockets:"+e);
System.exit(1);
}

connections = new Vector();

connect = new Thread(this);
connect.start();
}


public void run()
{
try
{
while(true)
{
Socket client=listen.accept();

connection c = new connection(this, client);
connections.addElement(c);

}
} catch (IOException e)
{
System.out.println("Fehler beim Warten auf Verbindungen:"+e);
System.exit(1);
}
}
public void broadcast(String msg)
{
int i;
connection you;

for (i=0; i<connections.size(); i++)
{
you = (connection) connections.elementAt(i);
you.out.println(msg);
}
}
}

Connection-Klasse

import java.net.*;
import java.io.*;

class connection extends Thread
{
protected Socket client;
protected DataInputStream in;
protected PrintStream out;
protected chatserver server;

public connection(chatserver server, Socket client)
{
this.server=server;
this.client=client;

try
{
in = new DataInputStream(client.getInputStream());
out = new PrintStream(client.getOutputStream());
} catch (IOException e)
{
try { client.close(); } catch (IOException e2) {} ;
System.out.println("Fehler beim Erzeugen der Streams: " + e);
return;
}
this.start();
}

public void run()
{
String line;
try
{
while(true)
{
line=in.readLine();
if(line!=null)
server.broadcast(line);
}
} catch (IOException e)
{
System.out.println("Fehler:" + e);
}


}


}
Zero83 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.10.2005, 11:47 Nach oben    #2
Neuer Benutzer
 
Registriert seit: 07.10.2005
Beiträge: 23
Standard ...

der absoluten vollständigkeit halber (man weiss ja nie) hier noch der client code im extrem fall ...natürlich gibt den auch noch in einer applet version.

int port = 8765;

String server= "192.168.1.9";
String meldung = "hsdgedidü";
PrintStream sout;
Socket socket;
socket = new Socket();
try {
socket = new Socket(server, port);
sout = new PrintStream(socket.getOutputStream());
String inp = meldung;
sout.println(inp);
System.err.println("Verschickt");
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection.");
System.exit(1);
}

try {
socket.close();
System.out.println("Socket geschlossen");
}
catch(IOException e) {
System.out.println("Socket nicht geschlossen");
}
Zero83 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.10.2005, 21:27 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Der Client sendet, wenn der Socket geschlossen wird das byte -1
So kannst du also feststellen, das der Client den Socket gechlossen, und somit die Verbindung getrennt hat.

Dummerweise funktionier das aber nicht, wenn der Client den Socket nicht schließt, sondern zum Beispiel im Betrieb abgeschaltet wird, oder das Internet nicht mehr geht.
Wenn es eine dauerhafte Verbindung ist, würde ich dem Client all 5 Sekunden ein Byte senden, das dieser dann also "Echo request" erkennt, und ein byte zurücksendet.
Kommt nichts zurück, ist der Client nicht mehr da (Client timed out).
Dann darfst du natürlich nicht vergessen dem Socket auch einen Timeout zu geben.

Vielleicht kannst du das mit dem Echo auch über socket.isConnected() lösen, da bin ich mir aber eher unsicher, ob er wirklich prüft ob der client noch da ist.
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.10.2005, 03:34 Nach oben    #4
`B
Benutzer
 
Benutzerbild von `B
 
Registriert seit: 05.07.2004
Beiträge: 95
Standard

Diese Lösung wäre dann sehr nahe an der Lösung des IRC "Ping & Pong" nennt sich das dort. Sollte ja eigentlich geläufig sein.

Das Problem ließe sich allerdings auch von einer anderen Richtung aus ansteuern. Wenn du beim Broadcast an alle deine eingeloggten User etwas schickst und dabei eine Bestätigung des Clients als Antwort immer bekommst. So in der Art eines POP3-Protokolls oder so "+OK" bei empfangener Nachricht zum Beispiel. Wäre aber eher eine schlechtere Variante zum Ping Pong aber eine leichter umzusetzendere.
__________________
`B ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 13:41 Nach oben    #5
Neuer Benutzer
 
Registriert seit: 07.10.2005
Beiträge: 23
Standard

Hey
danke für die Inputs ...werde glaub noch ein Timeout für den Socket einbauen ....bei 5min inaktivität oder so.

Ich habe mittlerweile bemerkt, dass "in.readLine();" ununterbrochen einen Null-Wert einliest wenn am anderen Ende des Socket niemand mehr da ist. ....ist natürlich fraglich in wie vielen anderen Fällen ich auch noch Null-Werte erhalte.

Wie gross ist eigentlich die wahrscheinlichkeit, dass die Lines irgendwo im WWW verloren gehen? Oder besteht die Möglichkeit, dass eine zuerst abgeschickte Meldung nach einer späteren eintrifft?
--->Konnte das ganze bis jetzt erst hier lokal im heimnetz testen...

Je nach dem müsste ich dann vieleicht doch sowas wie Handshaking ..pingpong einsetzten. ...einen interpreter für steuerbefehle muss ich ja sowieso einbauen
Zero83 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.10.2005, 18:00 Nach oben    #6
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Das etwas bei einer TCP Verbindung abhanden kommt ist glaube ich so ziemloich ausgeschlossen.
Deshalb ist diese Verbindungsart ja auch etwas langsamer, da der Rechner, der die Daten versendet, auch prüft ob sie ankommen.
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 12:55 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 07.10.2005
Beiträge: 23
Standard

PUh immerhin ...das ganze Projekt nahm langsam ungeahnte Formen an ...schon das dreifache an zeit verbraten ..und noch nicht mal in der hälfte.

Hast vieleicht auch noch Ahnung von Layouts in applets?
..wie ich z.B. bei einem FlowLayout das Textfeld auf 100% des Fensters bringe ...
oder bei einem Border Layout drei Elemente im Norden platziere

...hab mich bis jetzt gescheuht ein GridBagLayout anzuwenden ...aber wenns den sein muss.

Jedenfalls herzlichen Dank und Gruss
Zero83 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 13:34 Nach oben    #8
m15ch3r
Gast
 
Beiträge: n/a
Standard

Hi,

beim Layout solltest du vielleicht deine Vorstellungen etwas konkretisieren (vielleicht mit einer kleinen Skizze). Eine Lösung gibt's da eigentlich immer.

Wegen den 3 Elementen im Norden: Du kannst Layouts in einander verschachteln. Also kannst du z.B. ein BorderLayout benutzen und in den Norden noch ein BoxLayout reinlegen, orientiert an der X- oder Y-Achse, je nachdem ob die 3 Elemente nebeneinander oder übereinender liegen sollen.

MfG
mischer
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.10.2005, 13:56 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 07.10.2005
Beiträge: 23
Standard

Layouts verschachteln ..ja so
..ihr seid ja echt der hoffnungschimmer in der dunkelheit :cool:
...ich probier das gleich mal aus
Zero83 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Checkboxen prüfen Garnele PHP-Programmierung 21 15.05.2007 11:38
SSL Verfügbarkeit prüfen #pointer# PHP-Programmierung 8 06.01.2007 18:38
Verbindung zu Modem klappt von Laptop aus nicht Mirod Tools, Server, Betriebssysteme 3 21.10.2006 00:36
prüfen ob ordner oder datei Igi PHP-Programmierung 14 26.08.2005 23:27
Sockets hinter einem Router sparrow Allgemeine Java-Programmierung 3 04.07.2005 15:31


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45