Сокет, не закрывающийся серверную сторону при вызове socket.close () в клиенте JAVA

У меня есть проблемы с сокетами в Java. У меня есть a ServerSocket это слушает с, принимают () и потоки икры для каждого клиентского запроса. Коммуникация между клиентами и сервером хорошо работает. Я использую inputstream для чтения данных от клиентов в serverthreads, как:

inputStream = mySocket.getInputStream();
bytes = inputStream.read(buffer);

Моя проблема состоит в том, что, если я называю socket.close () от клиентов, ничего не происходит с блокирующимся вызовом bytes = inputStream.read(buffer);, это продолжает блокироваться. Но это работает, если я закрываю сокет с сервера, затем inputStream.read(buffer); из клиента возвращается "-1".

СЕРВЕР-MAINTHREAD:

//SERVER MAIN THREAD, SPAWNS CLIENT THREADS
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
while (listening){

new ServerThread(serverSocket.accept(), monitor).start();
}

СЕРВЕР-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;
            }
        }
    }

КЛИЕНТ:

InetAddress serverAddr = InetAddress.getByName("serverhostname");

socket = new Socket(serverAddr, PORT);

socket.close(); //Close the socket connection from client. Nothing happens in the serverthread
6
задан Johan - reinstate Monica 5 October 2013 в 15:31
поделиться