Socket nicht schließen serverside beim Aufruf von socket.close() im JAVA-client
Ich habe Probleme mit sockets in java. Ich habe eine ServerSocket
empfangsbereit ist mit accept() und threads erstellt für jede client-Anfrage. Die Kommunikation zwischen den clients und dem server funktioniert. Ich bin mit einem inputstream zum Lesen von Daten aus Kunden in den serverthreads, wie:
inputStream = mySocket.getInputStream();
bytes = inputStream.read(buffer);
Mein problem ist, dass, wenn ich rufe-Buchse.close () - von den Kunden, geschieht nichts, um den blockierenden Aufruf von bytes = inputStream.read(buffer);
, es weiterhin zu blockieren. Aber es funktioniert, wenn ich in der Nähe der socket vom server, dann die inputStream.read(buffer);
des Kunden gibt "-1".
SERVER-MAINTHREAD:
//SERVER MAIN THREAD, SPAWNS CLIENT THREADS
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
while (listening){
new ServerThread(serverSocket.accept(), monitor).start();
}
SERVER-CLIENTTHREADS:
public class ServerThread extends Thread{
public ServerThread(Socket socket, Monitor monitor) {
this.socket = socket;
this.monitor = monitor;
}
public void run(){
byte[] buffer = new byte[1024];
int bytes;
//Listen
while(true){
try {
InputStream inputStream = socket.getInputStream();
monitor.doStuffWithOtherThreads(Object myObject);
bytes = inputStream.read(buffer); //Problem
if (bytes == -1){
System.out.println("breaks");
break;
}
byte[] readBuf = (byte[]) buffer;
String readMessage = new String(readBuf, 0, bytes);
System.out.println(readMessage);
System.out.println(bytes);
} catch (IOException e) {
System.out.println("Connection closed");
break;
}
}
}
CLIENT:
InetAddress serverAddr = InetAddress.getByName("serverhostname");
socket = new Socket(serverAddr, PORT);
socket.close(); //Close the socket connection from client. Nothing happens in the serverthread
- Haben Sie ein kleines Beispiel demonstriert dieses Verhalten ? inputStream.read(buffer); soll -1 zurückgeben, in diesem Fall, werden Sie die Prüfung für -1 explicittly ?
- Aktualisiert mit Beispiel-code. Und ja ich checke -1 ausdrücklich. Die thread-noch-blocks read();
- Eine einfache Lösung ist, den client senden ein "trennen" - Meldung direkt vor dem Aufruf
close()
, und die server brechen aus der Schleife, wenn diese Nachricht empfangen wird. - Ja, ich habe nachgedacht. Aber es ist nicht die beste Lösung, vielleicht.
- Dein Beispiel-code nicht überprüfen -1. Also entweder, dass ist immer noch das problem-oder das ist nicht der echte code, in dem Fall müssen Sie noch nach dem eigentlichen code.
- Wahr. Es ist nicht der echte code. Aber ich check -1 direkt nach dem read () - Aufruf. Poste den code bald. Ich bin bei der Arbeit.
- Ok, habe ich aktualisiert, der code jetzt.
- Immer nach echten code. doStuffWithOtherThreads() sieht verdächtig aus - ich hatte eine Vermutung und sagen, Sie haben threading Probleme, wie eine race-condition oder einem deadlock.
- Sicher, das könnte schon das problem. Aber in diesem Fall nicht. Ich habe für deadlocks und es ist auch nicht das problem. Wie ich schon sagte, es funktioniert, wenn ich simulieren meinem android-Anwendung auf meinem Arbeitsplatz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Server-code, den Sie geschrieben nicht überprüfen -1. Also entweder das ist das problem-oder das ist nicht der echte code, in diesem Fall sollten Sie post von der real code für Kommentar.
BEARBEITEN den code, Den Sie gepostet haben, nicht so verhält, wie Sie Sie beschrieben haben.
Ich weiß nicht, ob ich verstehe Ihre Frage, aber ich würde sagen, dass es normal ist, dass es bis auf den server, schließen Sie die Steckdose.
Auf der server-Seite (in einem unabhängigen thread) haben Sie die socket :
Dann wohl (im selben thread, wenn es ein kleiner server) eine Schleife, die eingehende verbindungen (keine Ausnahme-management, wahrscheinlich die Buchse.in der Nähe ist in einem finally-block) :
Auf der client-Seite, die Sie haben :
Sollte der server wissen, Wann es erreicht hat, das Ende der Anfrage. Zum Beispiel in http, könnte es sein (aus einem mockHttpServer in scala so könnte es einige Fehler, aber der Prozess ist der gleiche):
BEARBEITEN :
Ich lese den code Hinzugefügt und ich noch nicht bekommen :
Haben Sie 3 "Steckdosen" :
Dem server öffnen und zu schließen, Zuhören und "akzeptieren" - Buchse, und sollte keine Auswirkungen der schlechten client-socket-management.
Dann, wenn Sie möchten, dass Ihre server zu akzeptieren, die mehrere gleichzeitige verbindungen, können Sie fügen Sie einen ThreadPool für die Annahme von verbindungen und die Behandlung von Anfragen und Antworten.
Versuchen, diese in Ihren Android-client code :
Sollte es besser sein 😉