Prise de ne pas fermer les serverside lors de l'appel de socket.close() en JAVA cliente

Je vais avoir des problèmes avec des sockets en java. J'ai un ServerSocket qui est à l'écoute avec accept() et engendre des threads pour chaque client demande. La Communication entre les clients et le serveur fonctionne très bien. Je suis en utilisant un inputstream pour lire les données de vos clients dans la serverthreads, comme:

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

Mon problème est que si je l'appelle socket.close() de la part des clients, il ne se passe rien à l'appel de blocage de bytes = inputStream.read(buffer);, il continue à bloquer. Mais il fonctionne si je ferme la socket du serveur, puis le inputStream.read(buffer); de la client retourne la valeur "-1".

SERVEUR MAINTHREAD:

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

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

SERVEUR 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
Avez-vous un petit exemple illustrant ce problème ? inputStream.read(buffer); doit retourner -1 dans ce cas, êtes-vous de vérifier pour -1 explicittly ?
Mis à jour avec des exemples de code. Et oui j'ai vérifier -1 explicitement. Le thread encore des blocs à lire();
Une solution simple est de demander au client d'envoyer un "déconnexion" message juste avant l'appel de close(), et le serveur de sortir de la boucle lorsque ce message est reçu.
Oui, j'ai pensé à ce sujet. Mais ce n'est pas la meilleure solution, peut-être.
Votre exemple de code ne vérifie pas pour -1. Donc, soit c'est encore le problème ou qui n'est pas le vrai code, auquel cas vous avez encore besoin d'afficher le code réel.

OriginalL'auteur James Ford | 2010-07-21