gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:20 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com