java - 在客户端 JAVA 中调用 socket.close() 时套接字不关闭服务器端

标签 java sockets multithreading inputstream

我在 java 中遇到套接字问题。我有一个 ServerSocket 正在监听 accept() 并为每个客户端请求生成线程。客户端和服务器之间的通信工作正常。我正在使用输入流从服务器线程中的客户端读取数据,例如:

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

我的问题是,如果我从客户端调用 socket.close(),bytes = inputStream.read(buffer); 的阻塞调用没有任何反应,它会继续阻塞。但是,如果我关闭来自服务器的套接字,它会起作用,然后客户端的 inputStream.read(buffer); 返回“-1”。

服务器维护线程:

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

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

服务器-客户端线程:

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

最佳答案

您发布的服务器代码不检查 -1。因此,这要么是问题所在,要么不是真正的代码,在这种情况下,您应该发布真正的代码以供评论。

编辑您发布的代码与您描述的不一样。

关于java - 在客户端 JAVA 中调用 socket.close() 时套接字不关闭服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303628/

相关文章:

java - Spring 启动启动器。如何在启动器 'x' 完成 beans 创建之前停止初始化其他启动器?

java - 支票乱了?

c++ - 如何使应用程序线程安全?

c# - 如果线程花费太长时间,如何停止线程

java - 无法识别分割字符

java多线程阅读..请帮助我对java很陌生:(

java - 如何将 Java 数组转换为 JavaCV 矩阵?

java - JAXB un/marshalling : Is there a difference between using arrays and lists?

sockets - .Net Core 2.0 中进程之间的传输套接字(DuplicateAndClose 替代方案)

c - 在 C 中使用 select() 和 write_fds 时发送数据的正确方法