我正在尝试使用NIO2并遇到问题。
这是我正在使用的代码:
ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);
channel.read(buffer, null, new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) {
Packet packet = new Packet(buffer.getInt(), buffer);
PacketHandler handler = PacketHandler.forOpcode(packet.getOpcode());
if(!Objects.isNull(handler)) {
handler.handle(channel, packet);
} else {
System.out.println("Unexpected opcode received from client. Opcode: " + packet.getOpcode());
}
}
@Override
public void failed(Throwable exc, Object attachment) {
System.out.println("DEBUG A");
exc.printStackTrace();
}
});
问题在于,无论我发送什么服务器,它都永远不会完成。出于测试目的,我有一个非常平面格式的登录数据包设置,我通过客户端发送这些数据:
ByteBuffer buffer = ByteBuffer.allocate(28);
buffer.putInt(1); //opcode
ByteBufferUtils.putString(buffer, "admin");
ByteBufferUtils.putString(buffer, "admin");
channel.write(buffer);
即使客户端写入数据,服务器也永远不会读完。我还确保(DEFAULT_BUFFER_SIZE)等于发送缓冲区大小以查看是否存在问题,但功能仍然没有任何变化。
每当我断开客户端时(当前使用线程使其保持活动状态,绝对没有理由)我从#failed
获得以下打印堆栈跟踪
java.io.IOException: The specified network name is no longer available.
at sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:309)
at sun.nio.ch.Iocp.access$700(Iocp.java:46)
at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399)
at java.lang.Thread.run(Thread.java:745)
答案 0 :(得分:3)
你不发送任何东西。在调用flip()
之前,您需要write(),
缓冲区,然后再调用compact()
。