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