我正在为游戏的服务器上工作。服务器的数据包读取循环处于阻塞状态,通常会一直等到收到数据包才能继续循环。但是,如果客户端断开连接,则DataInputStream将返回一个单字节(-1),并按预期顺序快速连续执行循环。但是,我不使用DataInputStream的read()方法一次读取一个字节,我使用read(byte [])方法一次将它们读入一个字节数组中。因此,我不容易检测到流是否返回值为-1的单个字节。检测DataInputStream流结束
可能的解决方案:我可以检查数组的第一个字节是否为-1,如果是,则遍历数组以查看数组的其余部分是否为零。然而,这样做效率极低,我认为这会随着客户数量的增加而影响性能。
这是我的包读取环路的简化版本:
while (!thread.isInterrupted() && !isDisconnected())
{
try
{
byte[] data = new byte[26];
data = new byte[26];
input.read(data);
//Need to check if end of stream here somehow
Packet rawPacket = Packet.extractPacketFromData(data); //Constructs packet from the received data
if(rawPacket instanceof SomePacket)
{
//Do stuff with packet
}
}
catch(IOException e)
{
disconnectClient(); //Toggles flag showing client has disconnected
}
}
你应该看'readFully'顺便说一句。 –