2015-05-18 95 views
1

我正在试验NIO2并遇到问题。AsynchronousSocketChannel#读取永远不会完成。

下面是我使用的代码:

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) 

回答

3

您还没有发送任何得到下面的打印堆栈跟踪。之后您需要调用write(),compact()之前的缓冲区。

+0

为什么?你能解释一下吗? – Pangamma