【发布时间】:2015-06-26 04:18:40
【问题描述】:
我现在正在服务器上开发一款游戏。服务器的数据包读取循环是阻塞的,通常会等到接收到数据包才能继续循环。但是,如果客户端断开连接,DataInputStream 会返回一个字节 (-1),并且循环会按预期快速连续执行。但是,我不使用 DataInputStream 的 read() 方法一次读取一个字节,而是使用 read(byte[]) 方法一次将它们全部读取到一个字节数组中。因此,我无法轻松检测流是否返回值为 -1 的单个字节。
可能的解决方案:我可以检查数组的第一个字节是否为 -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
}
}
【问题讨论】:
-
你应该看看
readFullybtw。
标签: java arrays networking packet datainputstream