我正在尝试使用线程运行方法从套接字读取数据:
@Override
public void run() {
while(true){
try{
String o = "";
socketServer = new ServerSocket(port);
System.out.println("Waiting for connection on port "+port+".");
Socket socket = new Socket();
socket = socketServer.accept();
System.out.println("Connection got.");
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int c;
while(( c = input.read()) != -1)
o += (char)c;
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("ok");
output.flush();
output.close();
input.close();
socket.close();
socketServer.close();
textFieldMessage.setText("Сообщение от "+socket.getInetAddress().getCanonicalHostName()+":\n"+o);
}catch(Exception e){
e.printStackTrace();
System.exit(-1);
}
}
}
但它卡在了 while 循环中。调试器告诉最后没有 -1 值。 这里有什么问题吗?
最佳答案
因为您是从套接字读取数据,所以除非套接字或流已关闭,否则您永远不会到达流的末尾。所以 while 循环将在 input.read()
上阻塞,因为它不会返回 -1,直到客户端关闭流/套接字。
不太确定您从套接字读取的是什么,但您可以尝试使用 BufferedReader 的 readLine()
方法。您可以提前知道需要阅读多少行,或者以一个空行结束阅读(如 HTTP)。
关于java - 缓冲区读取器意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035477/