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.

InformationsquelleAutor James Ford | 2010-07-21
Schreibe einen Kommentar