【发布时间】:2011-03-19 05:35:11
【问题描述】:
我在 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
【问题讨论】:
-
你有一个小例子来展示这种行为吗? inputStream.read(缓冲区);在这种情况下应该返回 -1,你是否明确检查 -1 ?
-
更新了示例代码。是的,我明确检查 -1。线程仍然阻塞在 read();
-
一个简单的解决方案是让客户端在调用
close()之前发送一条“断开连接”消息,然后服务器在收到此消息时退出循环。 -
是的,我已经考虑过了。但它可能不是最好的解决方案。
-
您的示例代码不检查 -1。所以要么这仍然是问题,要么不是真正的代码,在这种情况下你仍然需要发布真正的代码。
标签: java sockets multithreading inputstream