Java nio的一些问题

Java nio的一些问题,java,nio,Java,Nio,我决定用JavaNIO制作我的UDPclient和UDPserver。 但有几件事我不明白。 这是密码 try { DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); channel.connect(remote); //monitoring Selector selector = Selector.open(); //read write keys c

我决定用JavaNIO制作我的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
中的事件?若服务器发送了一些可读取的事件,会发生吗? 我不知道当用户编写“GETL”或“REGR”(我自己的方法)时如何处理我的事件

  • 传递给
    select
    的值是超时,而不是通道数

  • 你需要做什么

    DatagramChannel channelFromKey=(DatagramChannel)key.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);
        }
    
    如果我在控制台中写入内容,则key.isWritable中的事件将 发生了什么

    否。将发生的唯一事件是在您已向选择器注册的频道上。您没有注册任何与控制台相关的频道,您也不能注册,因为只有网络频道是可选择的频道,因此您必须有理由预期来自控制台的事件会通过选择器出现

    若服务器发送了一些可读取的事件,会发生吗

    我不知道如何处理我的事件,例如用户 写“GETL”或“REGR”(我自己的方法)


    我也不知道。我甚至不明白这个问题。您将从选择器中获得的唯一事件是它在您注册的频道上定义的事件。

    但是如果您不仅要从套接字读取,还要从BufferedReader.readline读取?您没有使用流式套接字。您正在使用数据报套接字。这意味着您的接收将是数据报数据包。ReadLine在这方面没有多大意义。事实上,BufferedReader在任何套接字上都没有多大意义。使用通道的想法是,不仅可以从套接字读取数据,还可以从键盘读取数据……因此,即使使用通道也不可能……啊,我明白了。您可能想查看策略模式,以及如何将其应用到您的用例中。