0

我有如下代码:

Bytebuffer buffer1= ByteBuffer.allocate(1024); Bytebuffer buffer2= ByteBuffer.allocate(1024);

而(真){

selector.select();
System.out.println("Ready Selector: "+num);
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();


while(it.hasNext())
   {

   SelectionKey key= (SelectionKey) it.next();

   if(key.isReadable())
    {

      if(key.attachment.toString("Socket1")
         {
            //read data and store in buffer 1
            SocketChannel channel1= (SocketChannel) key.channel();
             while (true) {

             int number_of_bytes=channel1.read(buffer1);                             
                          if (number_of_bytes <= 0) {
                              System.out.println("Number of bytes: "+number_of_bytes);
                              if(number_of_bytes==-1)
                              {
                                  key.cancel();
                                  channel1.close();
                              }
                            break;
                          } 

         }
     else if(key.attachment.toString("Socket2")
         {
            //read data and store in buffer 2

SocketChannel channel2= (SocketChannel) key.channel();

             while (true) {

             int number_of_bytes=channel1.read(buffer2);                             
                          if (number_of_bytes <= 0) {
                              System.out.println("Number of bytes: "+number_of_bytes);
                              if(number_of_bytes==-1)
                              {
                                  key.cancel();
                                  channel2.close();
                              }
                            break;
                          } 

         }
       }
} 

现在我面临的问题是,我只从一个套接字获取数据。就像我首先打开 socket1 并输入了一些数据一样。我可以在上面的代码中读取该数据,但未读取 socket2 数据。同样,如果我先运行 socket2 然后再运行 socket1,我可以读取 socket2 数据但无法读取 socke1 数据。请帮我找出代码中的错误..

4

1 回答 1

0

如果没有看到更多代码,就不可能说出您的问题是什么,但是您的选择循环应该如下所示:

while(it.hasNext())
{
    SelectionKey key= (SelectionKey) it.next();
    it.remove();
    if (!key.isValid())
        continue;
    if(key.isReadable())
    {
        SocketChannel sc = (SocketChannel)key.channel();
        // read the channel
    }
}

您根本不需要String附件;您需要检查每个密钥的有效性;并且您需要在处理时从选定的键集中删除每个键。

如果您的代码仍然不能像这样工作,那么您在其他地方有问题,或者没有人发送到第二个连接。

编辑:重新编辑,如果读取零字节,则必须退出读取循环;否则,您只是在无事可做的情况下无意识地旋转,并饿死其他通道。您无需取消密钥:关闭通道即可

于 2013-10-28T07:59:04.683 回答