Java getInputStream读取不退出

时间:2013-09-04 08:15:51

标签: java serversocket

您好我已经创建了一个服务器套接字,用于使用getInputStream从套接字读取字节数组,但是在数据结束后getInputStream.read没有退出。以下是我的代码。

 class imageReciver extends Thread {
    private ServerSocket serverSocket;
    InputStream in;

    public imageReciver(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
   }


    public void run()
   {
     Socket server = null;
     server = serverSocket.accept();
     in = server.getInputStream();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buffer[] = new byte[1024];

    while(true){
    int s = 0;
    s = in.read(buffer); //Not exiting from here
    if(s<0) break;
    baos.write(buffer, 0, s);
    }
    server.close();     
    return;
  } 
 }    

如果我发送了2048个字节,那么从客户端开始,行in.read(buffer)应该在读取两次后返回-1,但它等待第三次读取。我怎么解决这个问题? 提前谢谢....

2 个答案:

答案 0 :(得分:3)

您的服务器基本上需要关闭连接。如果您尝试通过同一连接发送多条“消息”,则需要某种方式来指示消息的大小/结尾 - 例如长度前缀或使用消息分隔符。请记住,您正在使用协议 - 抽象只是这是一个数据流;你可以根据自己的意愿分解它。

有关详细信息,请参阅Marc Gravell's IO blog post中的“网络数据包”。

编辑:既然我们知道你有预期的长度,你可能想要这样的东西:

int remainingBytes = expectedBytes;
while (remainingBytes > 0) {
    int bytesRead = in.read(buffer, 0, Math.min(buffer.length, remainingBytes));
    if (bytesRead < 0) {
        throw new IOException("Unexpected end of data");
    }
    baos.write(buffer, 0, bytesRead);
    remainingBytes -= bytesRead;
}

请注意,这也会避免 overreading ,即如果服务器开始发送下一位数据,我们就不会读到它。

答案 1 :(得分:1)

  

如果我发送2048个字节,那么读取两次后,'in.read(buffer)'行应返回-1。

你在这里至少有两个错误。如果发送2048个字节,则“in.read(buffer)”行应执行 indeterminate 次,要读取总共2048个字节,然后阻塞。当对等体关闭连接时,它应该只返回-1。