我正在制作聊天服务器/客户端。我有一个BufferedReader从套接字读取我的输入流,当它.readLine()它阻塞。我添加了if(BufferedReader.ready()),但这意味着我无法再检测断开连接的客户端,就好像我确实添加了其他System.out.println(“客户端已断开连接”),然后每当客户端用户不发送消息时超过几毫秒,它假定用户已断开连接。 我怎么摆脱这个? 代码:
import java.io.BufferedReader;
import java.io.InputStream;
import java.net.Socket;
public class SpeechHandler implements Runnable {
public SpeechHandler (BufferedReader r, ServerMain sm, Socket soc) {
try {
boolean connected = true;
while (connected) {
try {
String text = null;
text = r.readLine();
if (!text.equals(null)) {
sm.tellAll(text);
}
} catch (Exception e) {
System.out.println("Client " + soc.getInetAddress() + " has disconnected");
sm.removeStream(soc.getInputStream());
sm.removeStream(soc.getOutputStream());
e.printStackTrace();
connected = false;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run () {
}
}
找到答案问题不是读者阻塞线程,而是所有代码都是在构造函数中编写的,而不是run()方法,因为这意味着其他线程等待在继续之前完成的构造函数。
答案 0 :(得分:0)
我有一个BufferedReader从套接字读取我的输入流,当它.readLine()时它会阻塞。
正确。这是指定的行为。
我添加了if(BufferedReader.ready()),但这意味着我无法再检测到断开连接的客户端
正确。 ready(),
的正确使用方法很少,而且不是其中之一。
然后,只要客户端用户发送的消息超过几毫秒,就会假定用户已断开连接。
这是您代码中的错误。在'几毫秒'之后不要'推测'。
如何解决这个问题?
您正在使用阻止I / O.您应该专门用一个线程从套接字读取,并检测流的结束或异常以指示对等断开连接。