Java BufferReader意外行为
我正在尝试使用线程运行方法从套接字读取数据:Java BufferReader意外行为,java,sockets,bufferedreader,serversocket,printwriter,Java,Sockets,Bufferedreader,Serversocket,Printwriter,我正在尝试使用线程运行方法从套接字读取数据: @Override public void run() { while(true){ try{ String o = ""; socketServer = new ServerSocket(port); System.out.println("Waiting for connection on port "+port+"."); S
@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);
}
}
}
但它在循环时被卡住了。调试器告知最后没有-1值。
这里出了什么问题?因为您正在从套接字读取数据,除非套接字或流已关闭,否则您永远无法到达流的末尾。因此while循环将阻塞
input.read()
,因为在客户端关闭流/套接字之前,它不会返回-1
不确定从套接字读取的是什么,但可以尝试使用BufferedReader的readLine()
方法。您可以知道需要提前阅读多少行,也可以在阅读结束时使用空行(如HTTP)
InputStream的read()方法会阻塞数据,直到数据可用为止
只有在检测到流的结尾时,它才能返回-1(虽然套接字不应该是这种情况),因此如果数据不可用,while循环将阻塞,即您的read调用将等待数据被读取
注:
但如果值为-1,则程序应该已退出。那么你在读什么呢?对等方没有关闭套接字,因此你永远不会得到-1,因此你在收到最后一个字符后阻塞了
read()
调用。你的策略有缺陷。您正在阅读EOS,然后希望能够撰写回复。除非对等方关闭套接字以进行输出,然后读取,否则这将永远不会起作用。您需要正确定义应用程序协议。目前,您希望对等机执行写/关闭/读取操作。没有意义。套接字流没有文件结束概念,因此,您永远不会得到-1(除非您在另一端播种值;)@MadProgrammer当然,它们有“文件结束概念”。Peer关上他的插座,你读到一个EOS。@EJP这是一个公平的观点