2012-04-05 26 views
0

私は、java nioでUDPクライアントとUDPサーバを作ることにしました。 しかし、私はいくつかのことを理解していません。 ここでは、コードnioとのいくつかの問題

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"(自分のメソッド)を書くときです。

答えて

1
  1. selectに渡す値は、チャネル数ではなくタイムアウトです。

  2. あなたは私はあなたがあなた自身のイベントで何を意味するのか理解していないchannel

    を使用しないで

    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); 
    } 
+0

ただし、ソケットからだけでなく、BufferedReader.readlineからも読み込む場合は、 –

+0

ストリーミングソケットを使用していません。あなたはデータグラムソケットを使用しています。これはあなたの受信がデータグラムパケットであることを意味します。 ReadLineはそのことをそれほど意識していません。実際、BufferedReaderはどんなソケットでもそれほど意味をなさない。 –

+0

チャンネルを使うアイデアは、fronソケットを読むだけでなく、キーボードからデータを読み込む機会になるということでした。チャンネルでも可能ではありません.... –

0

私はコンソールで何かを書く場合key.isWritableでイベントが発生します ?

いいえ発生するイベントは、セレクタに登録したチャンネルのみです。ネットワークチャネルだけがSelectableChannelsなので、コンソールからのイベントはセレクタを介して表示されることを期待する必要があります。

サーバーが何かイベントを送信した場合、isReadableが発生しますか?

はい。

たとえば、ユーザーの場合は (自分の方法)の「GETL」または「REGR」と入力すると、自分のイベントでの作業方法を理解できません。

私も質問は分かりません。セレクタから取得する唯一のイベントは、登録したチャンネルのイベントです。

関連する問題