gpt4 book ai didi

Java getInputStream 读取不退出

转载 作者:行者123 更新时间:2023-12-01 18:44:07 24 4
gpt4 key购买 nike

嗨,我已经创建了一个服务器套接字,用于使用 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,但它等待第三次读取。我该如何解决这个问题?提前致谢....

最佳答案

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

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

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

关于Java getInputStream 读取不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18608694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com