gpt4 book ai didi

java - Java.NIO 中顺序 channel 写入发送损坏的数据

转载 作者:行者123 更新时间:2023-11-30 04:23:22 25 4
gpt4 key购买 nike

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

最佳答案

我的猜测(根据您所包含的少量代码)是您根本没有描述您的消息。即使您分别发送 2 条消息,io 层也可能以各种方式拆分/组合这些消息,以便接收者获得附加到前一条消息的一条消息的一部分。您应该使用某种“消息”协议(protocol)向接收者准确指示要消耗多少字节,以便它可以正确解析每个传入消息(例如,首先写入消息字节长度,然后写入消息字节)。

顺便说一句,write() 方法不能保证在一次调用中写入所有字节,因此您应该处理返回值并根据需要写入剩余字节。

关于java - Java.NIO 中顺序 channel 写入发送损坏的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16447268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com