首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsynchronousSocketChannel#read永远不会完成。

AsynchronousSocketChannel#read永远不会完成。
EN

Stack Overflow用户
提问于 2015-05-18 02:17:52
回答 1查看 438关注 0票数 1

我正在尝试使用NIO2,并遇到了一个问题。

下面是我使用的代码:

代码语言:javascript
复制
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();
        }
    });

问题是,无论我发送什么服务器,它永远不会完成。出于测试目的,我设置了一个非常扁平的登录包,并通过客户端发送这些数据:

代码语言:javascript
复制
    ByteBuffer buffer = ByteBuffer.allocate(28);
    buffer.putInt(1); //opcode
    ByteBufferUtils.putString(buffer, "admin");
    ByteBufferUtils.putString(buffer, "admin");
    channel.write(buffer);

即使客户端写入数据,服务器也从未完成此操作。我还确保(DEFAULT_BUFFER_SIZE)与发送的缓冲区大小相等,以确定这是否是问题所在,但功能仍未发生任何更改。

每当我断开客户端连接(目前使用线程来保持其活动,绝对没有任何理由),我就从#failed获得以下打印堆栈跟踪

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 02:22:14

你什么都没发。您需要在调用flip()之前对缓冲区进行write(),,然后调用compact()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30294196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档