我正在爲遊戲的服務器上工作。服務器的數據包讀取循環處於阻塞狀態,通常會一直等到收到數據包才能繼續循環。但是,如果客戶端斷開連接,則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'順便說一句。 –