检测关闭的插座

时间:2014-08-27 12:27:54

标签: java multithreading sockets serversocket

我正在编写一个多线程服务器,目前只接收一个字符串并将其发送回大写。

我的问题是服务器没有检测到与客户端的连接何时丢失,因此客户端处理程序线程保持运行。

我有一个处理客户端请求的while循环,如果连接关闭/ lsot,我就会离开这个循环。

这是ClientHandler的代码

try {
            inFromServer = clientSocket.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);

            OutputStream outToServer = clientSocket.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);

            while(!clientSocket.isClosed()){
                if(in.available() > 0) {
                    String str = in.readUTF(); //Should catch EOF
                    System.out.println("[+] From " + clientSocket.getInetAddress() + " received: " + str);
                    String response = str.toUpperCase();

                    out.writeUTF(response);
                }
            }

            System.out.println("[+] Closing client");

        } catch (IOException e) {
            e.printStackTrace();
        }

我试图像这样制作while循环:

while(!clientSocket.isClosed() && inFromServer.read() != -1)

但这不起作用......

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

Socket.isClosed()仅在已关闭套接字时才返回true。您检测到连接已关闭的方式同行是通过阅读它。您不应该使用in.available()。相反,只需从套接字读取,套接字关闭时就会出现异常。