ノンブロッキング ソケット、nio を使用するサーバーがあります。サーバーは別のスレッドで動作し、ゲームと呼ばれる別のスレッドがあります。ゲーム スレッドはサーバー オブジェクトを保持し、server.sendMessage を使用します。サーバー スレッドはデータを読み取るだけです。while ループで 2 つのパケットに対して sendMessage を 2 回連続して呼び出すと、クライアントで「java.io.StreamCorruptedException: 無効なストリーム ヘッダー: 6B6574B4」エラーが発生します。
サーバーコードの一部:
public void write(SelectionKey channelKey, byte[] buffer) {
if (buffer != null) {
int bytesWritten;
try {
SocketChannel channel = (SocketChannel) channelKey.channel();
synchronized (channel) {
bytesWritten = channel.write(ByteBuffer.wrap(buffer));
}
if (bytesWritten == -1) {
resetKey(channelKey);
disconnected(channelKey);
}
} catch (Exception e) {
resetKey(channelKey);
disconnected(channelKey);
}
}
}
public void broadcast(byte[] buf, SelectionKey fr) {
synchronized (clientList) {
Iterator<SelectionKey> i = clientList.iterator();
while (i.hasNext()) {
SelectionKey key = i.next();
if (fr != key)
write(key, buf);
}
}
}
public synchronized void sendMessage(Packets pk) {
broadcast(pk.toByteArray(), null);
}