簡體   English   中英

Java中的多重套接字通信

[英]Muitiplexed socket communication in Java

我正在編寫一個服務器程序,該程序可以接受來自多個(但固定)數量的客戶端的通信。 我想讓程序保持單線程。 為此,我使用非阻塞套接字在每個客戶端上進行迭代,但是每個客戶端的通道都使用阻塞模式。 這是我的服務器代碼:

class server {
    public static void main(String args[])
         throws Exception {

        ServerSocketChannel channel = ServerSocketChannel.open();
        channel.configureBlocking(false);
        channel.socket().bind(new java.net.InetSocketAddress("localhost", 8005));
        System.out.println("Server attivo porta 8005");
        Selector selector = Selector.open();
        channel.register(selector, SelectionKey.OP_ACCEPT);

        for(;;) {
          selector.select();
          Set keys = selector.selectedKeys();
          Iterator i = keys.iterator();

          while(i.hasNext()) {
            SelectionKey key = (SelectionKey) i.next();

            i.remove();

            if (key.isAcceptable()) {
              SocketChannel client = channel.accept();
              client.configureBlocking(true);

              ObjectInputStream ois = new ObjectInputStream(
                    client.socket().getInputStream());
              String s = (String)ois.readObject();
              System.out.println(s);
            }
          }
        }
    }
}

客戶端使用簡單的阻塞I / O,如下所示:

class client {
    public static void main(String args[]) throws Exception {
        SocketChannel channel = SocketChannel.open();

        channel.configureBlocking(true);

        channel.connect(new java.net.InetSocketAddress("localhost", 8005));

        ObjectOutputStream oos = new ObjectOutputStream
              (channel.socket().getOutputStream());

        for (int i = 0; i < 100; i++) {
             oos.writeObject(new String("Hello " + i));
             System.out.println(i);
         }
    }
}

問題是,盡管客戶端要寫100次,但服務器僅讀取一次消息。 服務器和客戶端均未給出任何異常,但是我僅從服務器獲取輸出“ Hello 0”。 我在這里做什么有問題嗎? 如果是這樣,我有什么選擇?

謝謝。

更新:在服務器循環內關閉ObjectInputStream會導致客戶端出現BrokenPipeException(服務器的行為方式相同)。

問題是您只是在使用key.isAcceptable()檢查新連接。 您還需要使用key.isReadble()檢查讀取。 您應該只從key.isAcceptable()建立連接。

請參見Java ServerSocketChannel SocketChannel(回調)

問題在於服務器不等待客戶端發送所有數據。 在客戶端服務器程序中,您需要做的是在兩者之間建立清晰的協議,以使它們在傳輸/接收數據時保持同步。 通常,這是通過發送指定符號或在連接完成后關閉連接來向任一方發送信號的傳輸結束信號來完成的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM