0

嗨,我已经创建了一个服务器套接字,用于使用 getInputStream 从套接字读取字节数组,但是在 endof 数据到达后 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,但它在那里等待第三次读取。我该如何解决这个问题?提前致谢....

4

2 回答 2

3

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

有关更多信息,请参阅Marc Gravell 的 IO 博客文章中的“网络数据包” 。

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

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;
}

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

于 2013-09-04T08:17:28.243 回答
1

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

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

于 2013-09-04T08:35:46.533 回答