我有一个使用非阻塞套接字的服务器 nio。服务器在一个单独的线程中工作,并且还有另一个名为 Game 的线程。游戏线程持有服务器对象并使用server.sendMessage,服务器线程只读取数据。当我在一个while循环中为2个数据包顺序调用sendMessage两次时,过了一会儿我在客户端收到“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);
}