2017-02-09 19 views
0

以下のコードは、サーバーを正常に作成し、受信クライアントを受け入れます。NIOサーバーからのメッセージの送信

package socket; 

import java.nio.*; 
import java.nio.channels.*; 
import java.net.*; 
import java.util.*; 
import java.io.IOException; 

public class NonBlockingServer { 

    public static void main(String[] args) throws InterruptedException, IOException { 

     // Create a new Thread 
     Server s = new Server(); 
     new Thread(s).start(); 

     // Give 10 seconds for client to connect 
     Thread.sleep(10000); 

// This Doesn't work? 

     s.Write("Hello, Client!"); 

     System.out.println("Done"); 
    } 
} 

//A class which implements Runnable Interface 
class Server implements Runnable { 

    SocketChannel AcceptedClient; 
    ServerSocketChannel serverChannel; 
    Selector selector; 

    void Write(String s) throws IOException { 
     ByteBuffer buffer = ByteBuffer.allocate(s.length()); 
     buffer.put(s.getBytes()); 

     int numWrite = -1; 
     numWrite = AcceptedClient.write(buffer); 

     while (buffer.hasRemaining()) 
     { 
      numWrite += AcceptedClient.write(buffer); 
     } 

     System.out.println(numWrite); 
    } 

    @Override 
    public void run() 
    { 

     int port = 4041; 

     System.out.println("Listening for connections on port " + port); 

     try { 
      // Bind the port 
      serverChannel = ServerSocketChannel.open(); 
      ServerSocket ss = serverChannel.socket(); 
      InetSocketAddress address = new InetSocketAddress(port); 
      ss.bind(address); 

      // Non-blocking Server 
      serverChannel.configureBlocking(false); 

      // Register with Selector 
      selector = Selector.open(); 
      serverChannel.register(selector, SelectionKey.OP_ACCEPT); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return; 
     } 

     while (true) { 

      try { 

       // Blocks until a 'socket' is ready registered with selector is ready. 
       selector.select(); 

      } catch (IOException ex) { 
       ex.printStackTrace(); 
       break; 
      } 

      Set<SelectionKey> readyKeys = selector.selectedKeys(); 
      Iterator<SelectionKey> iterator = readyKeys.iterator(); 

      while (iterator.hasNext()) { 

       SelectionKey key = iterator.next(); 
       iterator.remove(); 

       try { 

        if (key.isAcceptable()) { 

         ServerSocketChannel server = (ServerSocketChannel) key.channel(); 
         SocketChannel client = server.accept(); 
         System.out.println("Accepted connection from " + client); 
         client.configureBlocking(false); 

         // Client accepted by server can read. 
         SelectionKey key2 = client.register(selector, SelectionKey.OP_READ); 

         AcceptedClient = (SocketChannel) key2.channel(); 

        } 

       } catch (IOException ex) { 
        key.cancel(); 
        try { 
         key.channel().close(); 
        } catch (IOException cex) { 
        } 
       } 
      } 
     } 
    } 
} 

しかし、私はそれがサーバーに接続された後にクライアントにメッセージを送信しようとすると、それはすなわち、メッセージがクライアントによって受信されない動作しません。

サーバーから特定のクライアントにメッセージを送信する正しい方法は何ですか?

私はインターネットを見て、サーバーがクライアントにメッセージを送信する例は見つけませんでした。

+0

あなたはとても見苦しくはありませんでした。インターネットはNIOでいっぱいで、例を送受信します。 Javaチュートリアルは、このサイトはもちろんのこと、初めに。私はそれについて何百もの質問に答えました。 – EJP

答えて

1

write()の前にバッファーをflip()にする必要があります。保存する場合は、後でcompact()にする必要があります。

NBチャンネルを閉じると、キーがキャンセルされます。

+0

これは反転後に機能します。ありがとう、EJP!私は知りたいサーバーが接続されたすべてのクライアントにメッセージをブロードキャストするようにしたいのであれば、OP_WRITEを使用しますか? – user963241

+0

私が今重要な質問は、ServerSocketChannelを閉じることです。スレッド、クライアントとサーバ、セレクタ、サーバ自体が接続されています。あなたは物事を閉め始めるために私を助けることができますか? – user963241

+0

Err、 'ServerSocketChannel.close()'、 'SocketChannel.close()'、 'Selector.close()'?新しい質問がある場合は、新しい質問として質問してください。これはフォーラムではありません。 – EJP

関連する問題