Java Socketがマルチスレッド通信機能を実現する例


本明細書の例は、Java Socketがマルチスレッド通信機能を実現する方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
前の文章の「Java Socketが単スレッド通信を実現する方法の例」で一番簡単なJava Socket通信をどう書くかという問題がありますが、記事の例では、ServerはCient一つの要求しか受けられません。最初のCient接続後はこの位置を占めています。後のCientはもう接続できないので、いくつかの変更が必要です。ServerはClient接続要求を受け付けていません。処理の流れを独立したスレッドに入れて実行し、次のClient接続要求を待つと、Server端末が要求を受信するのをブロックできなくなります。各独立して実行するプログラムは、ソケットオブジェクトを使用した後に閉じます。コードは以下の通りです

package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
  public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(10000);
    while (true) {
      Socket socket = server.accept();
      invoke(socket);
    }
  }
  private static void invoke(final Socket client) throws IOException {
    new Thread(new Runnable() {
      public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        try {
          in = new BufferedReader(new InputStreamReader(client.getInputStream()));
          out = new PrintWriter(client.getOutputStream());
          while (true) {
            String msg = in.readLine();
            System.out.println(msg);
            out.println("Server received " + msg);
            out.flush();
            if (msg.equals("bye")) {
              break;
            }
          }
        } catch(IOException ex) {
          ex.printStackTrace();
        } finally {
          try {
            in.close();
          } catch (Exception e) {}
          try {
            out.close();
          } catch (Exception e) {}
          try {
            client.close();
          } catch (Exception e) {}
        }
      }
    }).start();
  }
}

以下はClientプログラムコードです。

package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MyClient {
  public static void main(String[] args) throws Exception {
    Socket socket = new Socket("localhost", 10000);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(socket.getOutputStream());
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
      String msg = reader.readLine();
      out.println(msg);
      out.flush();
      if (msg.equals("bye")) {
        break;
      }
      System.out.println(in.readLine());
    }
    socket.close();
  }
}

テストは、まずMyServerクラスを実行し、二つのMyClientクラスを実行し、それぞれのMyClientのプロンプトに文字列を入力すると、ServerはそれぞれClientの要求を処理することができます。
java関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Java Socketプログラミング技術のまとめ」、「Javaファイルとディレクトリの操作テクニックのまとめ」、「Javaデータ構造とアルゴリズム教程」、「Java操作DOMノード技術のまとめ」、「Javaキャッシュ操作テクニックのまとめ
本論文で述べたように、皆さんのjavaプログラムの設計に役に立ちます。