Java 複数接続Socket通信サンプルプログラム(サーバー&クライアント)
サーバーは複数のクライアントからの接続を同時に処理できるようスレッドを使用。ポート番号は、30000。
クライアントからの接続を待ち、接続が行なわれたら1行のデータを受け取り、コンソールに表示して接続を切断する。
プログラム終了は,コマンドプロンプトでCTRL-C
クライアントはサーバーに接続し、メッセージを送信する。接続先サーバーアドレスはコマンドラインの第1引数で指定。
接続先ポートは30000に固定。先にMultiServerSampleを起動しておくこと。第2引数で、メッセージを指定する。
一行送ってサーバーからのメッセージ受信,表示後にプログラム終了する。
コマンドライン例:java MultiClientSample localhost abcdefg
↑この本はJavaの通信プログラムの基本理解に手頃です。あまり厚くないのでとっつきやすい。
//複数接続Socket通信サンプルプログラム(サーバー) //クライアントからの接続を待ち、接続が行なわれたら //1行のデータを受け取り、コンソールに表示して接続を切断する。 //複数のクライアントとの通信をスレッドにより行なう。 //プログラム終了は,コマンドプロンプトでCTRL-C import java.net.*; import java.io.*; class MultiServerSample { public static void main(String[] args){ ServerSocket serverSoc = null; try { // ポート番号は、30000 //ソケットを作成 serverSoc = new ServerSocket(30000); boolean flag=true; //クライアントからの接続を待機するaccept()メソッド。 //accept()は、接続があるまで処理はブロックされる。 //もし、複数のクライアントからの接続を受け付けるようにするには //スレッドを使う。 //accept()は接続時に新たなsocketを返す。これを使って通信を行なう。 System.out.println("Waiting for Connection. "); while(flag){ Socket socket=null; socket = serverSoc.accept(); //accept()は、クライアントからの接続要求があるまでブロックする。 //接続があれば次の命令に移る。 //スレッドを起動し、クライアントと通信する。 new SrvThread(socket).start(); System.out.println("Waiting for New Connection. "); } } catch (IOException e) { System.out.println("IOException!"); e.printStackTrace(); } finally{ try{ if (serverSoc != null){ serverSoc.close(); } } catch (IOException ioex) { ioex.printStackTrace(); } } } } class SrvThread extends Thread{ private Socket soc; public SrvThread(Socket sct){ soc=sct; System.out.println("Thread is Generated. Connect to " + soc.getInetAddress()); } public void run(){ try{ //socketからのデータはInputStreamReaderに送り、さらに //BufferedReaderによってバッファリングする。 BufferedReader reader = new BufferedReader (new InputStreamReader(soc.getInputStream())); //Clientへの出力用PrintWriter PrintWriter sendout = new PrintWriter(soc.getOutputStream(), true); //データ読み取りと表示。 String line; line = reader.readLine(); System.out.println("Message from client :" + line); //Clientにメッセージ送信 sendout.println("Message is received."); } catch(IOException ioex){ ioex.printStackTrace(); } finally{ try{ if(soc != null){ soc.close(); } } catch (IOException ioex){ ioex.printStackTrace(); } } } } //************ここまで、サーバーソフト。 //************以下、クライアントソフト。 //クライアントサンプルプログラム //サーバーに接続し、メッセージを送信する。 //サーバーアドレスはコマンドラインの第1引数で指定。 //ポートは30000に固定。先にMultiServerSampleを起動しておくこと。 //第2引数で、メッセージを指定する。一行送ってサーバーからの //メッセージ受信,表示後にプログラム終了する。 //コマンドライン例:java MultiClientSample localhost abcdefg import java.net.*; import java.io.*; class MultiClientSample { public static void main(String[] args) { try { //アドレス情報を保持するsocketAddressを作成。 //ポート番号は30000 InetSocketAddress socketAddress = new InetSocketAddress(args[0], 30000); //socketAddressの値に基づいて通信に使用するソケットを作成する。 // Socket socket = new Socket(); //タイムアウトは10秒(10000msec) socket.connect(socketAddress, 10000); //接続先の情報を入れるInetAddress型のinadrを用意する。 InetAddress inadr; //inadrにソケットの接続先アドレスを入れ、nullである場合には //接続失敗と判断する。 //nullでなければ、接続確立している。 if ((inadr = socket.getInetAddress()) != null) { System.out.println("Connect to " + inadr); }else { System.out.println("Connection failed."); return; } //メッセージの送信処理 //コマンドライン引数の2番目をメッセージとする。 String message = args[1]; //PrintWriter型のwriterに、ソケットの出力ストリームを渡す。(Auto Flush) PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); //ソケットの入力ストリームをBufferedReaderに渡す。 BufferedReader rd = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println("Send message: " + message); //ソケットから出力する。 writer.println(message); //もしPrintWriterがAutoFlushでない場合は,以下が必要。 // writer.flush(); //サーバーからのメッセージ読み取り String getline=rd.readLine(); System.out.println("Message from Server:" + getline); //終了処理 writer.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }