我有一台服务器使用非阻塞套接字nio。服务器在单独的线程中工作,并且有另一个称为游戏的线程。游戏线程保存服务器对象并使用server.sendMessage,服务器线程只读取数据。当我在一个while循环中连续两次调用sendMessage两次数据包后,我在客户端得到“java.io.StreamCorruptedException:invalid stream header:6B6574B4”错误。服务器代码Sequentally Channel Write在Java.NIO中发送损坏的数据
部分:
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);
}
+1对于“循环”,但你应该提到循环不是字面上的while(!allWritten){write(lastPartOfBuf();}',它是异步操作链。 – 2013-05-09 01:00:50