0

我决定用 java nio 制作我的 UDPclient 和 UDPserver。但我不明白几件事。这是代码

try {
  DatagramChannel channel = DatagramChannel.open();
  channel.configureBlocking(false);
  channel.connect(remote);
  //monitoring
  Selector selector = Selector.open();
  //read write keys
  channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);     
  ByteBuffer buffer = ByteBuffer.allocate(1024*64);//number of bytes for channel
  while (true) {
    selector.select(60000);//number of channels I think
    Set readyKeys = selector.selectedKeys();
    if (readyKeys.isEmpty()) { 
      break;
    }
    else {
      Iterator iterator = readyKeys.iterator();
      while (iterator.hasNext()) {
        SelectionKey key = (SelectionKey) iterator.next();
        iterator.remove();
        if (key.isReadable( )) {
          //read from buffer
          channel.read(buffer);
        } 
        if (key.isWritable()) {
          //write to buffer
          channel.write(buffer); 
        } 
      } 
    } 
  } 
} 
catch (IOException ex) {
  System.err.println(ex);
}  

如果我在控制台中写一些东西,事件key.isWritable会发生吗?如果服务器发送一些事件 isReadable 会发生吗?当例如用户编写“GETL”或“REGR”(我自己的方法)时,我不明白如何处理我的事件。

4

2 回答 2

1
  1. 您传递给的值select是超时而不是通道数。

  2. 你需要做

    DatagramChannel channelFromKey = (DatagramChannel) key.channel();

不使用channel

我不明白你所说的你自己的事件是什么意思。选择该键时,从通道中读取数据报。

Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
    SelectionKey key = (SelectionKey) iterator.next();
    iterator.remove();
    if (key.isReadable( )) {
        DatagramChannel channelFromKey = 
             (DatagramChannel) key.channel();
        buffer.clear();
        // This is a DatagramChannel receive a datagram as a whole
        channelFromKey.receive(buffer);
    }
于 2012-04-05T22:40:14.793 回答
0

如果我在控制台中写一些东西,key.isWritable 中的事件会发生吗?

不会。唯一会发生的事件是在您向选择器注册的频道上。您还没有注册任何与控制台有关的通道,而且您不能,因为只有网络通道是 SelectableChannels,所以您必须有理由期望源自控制台的事件通过 Selector 出现。

如果服务器发送一些事件 isReadable 会发生吗?

是的。

当例如用户编写“GETL”或“REGR”(我自己的方法)时,我不明白如何处理我的事件。

我也没有。我什至不明白这个问题。您将从选择器获得的唯一事件是它定义的事件,在您注册的通道上。

于 2012-04-06T00:41:28.333 回答