ich habe eine einfache client/server programm geschrieben
zuerst starte ich den server, dann den client der sich zum server verbinded. dann tauschen die beiden ein paar nachrichten aus und der client beendet seine verbindung. der server wartet dann mit x = y.accept(); auf einen neuen client.
bis hierher funktioniert es problemlos.
wenn ich den client jetzt wieder starte bekomme ich beim client die fehlermeldung "java.net.SocketException: Connection reset" und beim server "java.lang.NullPointerException".
ganz verstehe ich das nicht, da ich ja den client nur ein 2. mal starte, also exakt das selbe programm das beim 1. mal funktioniert hat.
muss ich dem server auch irgendwie mitteilen das der client die verbindung cancelt ? bis jetzt hab ich nur beim client die verbindung mit y.close(); gecancelt.
ja gut das sind die standard zeilen. was soll der server machen? was schickt der client usw.
Bsp.
Code:
// Server
public class Server {
public Server(int port) throws IOException {
ServerSocket server = new ServerSocket(port);
while(true) {
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String clientName = in.readLine();
System.out.println("New Client "+clientName+" vom "+client.getInetAddress);
IrgendetwasmitThread i_X = new IrgendetwasmitThread ();
i_X.start();
}
}
}
Code:
// Client
public class Client extends Thread{
...
try {
socket = new Socket(server, port):
...
this.start();
}
catch() {}
...
}
ich denke diese Sachen sollten reichen. Habe einige Zeilen ausgelassen. Wenn doch Bedarf ist posten.
mein problem ist ja das eigentlich alles so läuft wie es soll, nur das wenn ich den client beende und nocheinmal starte, nichts mehr gesendet wird. nur ich weiß nicht warum
das habe ich schon verstanden. aber ich hatte gefragt was dein server macht !!! nicht client. was macht er? hängt der sich auf wenn ein client abschmiert?
der server liest einen string mit "String s = in.readLine();"ein. da bekommt er null zurück, obwohl der client eigentlich mit "out.println("start");" etwas sendet. nachdem der client das gesendet hat, bekomme ich beim client die fehlermeldung "java.net.SocketException: Connection reset"
der server soll nur jeweils eine verbindung aktzeptieren. d.h zuerst verbinde ich den client ein mit dem server, dann beendet der client die verbindung und dann verbinde ich ihn noch einmal mit dem server.
public void setReuseAddress(boolean on)
throws SocketException
Enable/disable the SO_REUSEADDR socket option.
When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.
Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.
When a ServerSocket is created the initial setting of SO_REUSEADDR is not defined. Applications can use getReuseAddress() to determine the initial setting of SO_REUSEADDR.
The behaviour when SO_REUSEADDR is enabled or disabled after a socket is bound (See isBound()) is not defined.
das ist doch auch OK. aber sobald du den client beendest und neu verbindest hast du doch den zweiten client sozusagen. meldest du es richtig beim server ab?