システムプログラム(第8週): スレッドによる複数のクライアントに対するサービスの同時提供(Java版)

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2012/2012-06-06 /echo-server-java-thread.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2012/
http://www.coins.tsukuba.ac.jp/~yas/

EchoServer.java

EchoServer.java は、 EchoServerSingle.java をスレッドを用いて修正して、複数のクライアントに対してサービスを同時に 提供できるようにしたものである。
 $ diff -c EchoServerSingle.java  EchoServer.java
 *** EchoServerSingle.java	2012-05-28 16:01:05.000000000 +0900
 --- EchoServer.java	2010-05-21 17:16:40.000000000 +0900
 ***************
 *** 1,35 ****
   /*
 ! 	EchoServerSingle.java -- 文字列を送受信するサーバ(TCP/IP, Java版, スレッドなし)
 ! 	~yas/syspro/ipc/EchoServerSingle.java
 ! 	Created on 2004/05/09 20:00:24
   */

   import java.net.*;
   import java.io.*;

 ! class EchoServerSingle
   {
       public static void main(String argv[]) throws IOException {
	 if( argv.length != 1 )
	 {
 ! 	    stderr.printf("Usage: %% java EchoServerSingle port\n");
	     System.exit( -1 );
	 }
	 int portno = Integer.parseInt( argv[0] );
 ! 	echo_server_single( portno );
       }

 !     public static void echo_server_single( int portno ) throws IOException
       {
	 ServerSocket acc = new ServerSocket( portno );
	 print_my_host_port( portno );
	 while( true )
	 {
 - 	    stdout.printf("accepting incoming connections (hash== %s) ...\n", acc.hashCode());
	     Socket com = acc.accept();
	     tcp_peeraddr_print( com );
 ! 	    EchoServerWorker esw = new EchoServerWorker(com);
 ! 	    esw.run();
	 }
       }
       public static void print_my_host_port( int portno ) throws UnknownHostException
 --- 1,34 ----
   /*
 ! 	EchoServer.java -- 文字列を送受信するサーバ(TCP/IP, Java版)
 ! 	~yas/syspro/ipc/EchoServer.java
 ! 	Created on 2004/02/14 16:22:13
   */

   import java.net.*;
   import java.io.*;

 ! class EchoServer
   {
       public static void main(String argv[]) throws IOException {
	 if( argv.length != 1 )
	 {
 ! 	    stderr.printf("Usage: %% java EchoServer port\n");
	     System.exit( -1 );
	 }
	 int portno = Integer.parseInt( argv[0] );
 ! 	echo_server( portno );
       }

 !     public static void echo_server( int portno ) throws IOException
       {
	 ServerSocket acc = new ServerSocket( portno );
	 print_my_host_port( portno );
	 while( true )
	 {
	     Socket com = acc.accept();
	     tcp_peeraddr_print( com );
 ! 	    Thread th = new Thread( new EchoServerWorker(com) );
 ! 	    th.start();
	 }
       }
       public static void print_my_host_port( int portno ) throws UnknownHostException

実行例

実行例。 サーバ側。サーバは、終了しないので、最後に、^C を押して、割り込みを掛け て終了させる。 注意:全員がポート番号 1231 を使うとプログラムが動かないことがある。
$ cp ~yas/syspro/ipc/EchoServer{,Worker}.java . [←]
$ ls *java [←]
EchoServer.java         EchoServerWorker.java
$ javac -encoding EUC-JP EchoServer.java EchoServerWorker.java [←]
$ ls *class [←]
EchoServer.class        EchoServerWorker.class
$ java EchoServer [←]
Usage: % java EchoServer port
$ java EchoServer 1231 [←]
run telnet cosmos10 1231
connection (hash== 981863753) from 130.158.86.150:57863
received (com hash==981863753) 5 characters, [012
]
connection (hash== 933725891) from 130.158.86.1:54975
received (com hash==933725891) 5 characters, [abc
]
received (com hash==933725891) 5 characters, [def
]
received (com hash==981863753) 5 characters, [345
]
connection (com hash==981863753) closed.
connection (com hash==933725891) closed.
^C
$ []
クライアント側(その1)。
$ telnet cosmos10 1231  [←]
Trying 130.158.86.150...
Connected to cosmos10.coins.tsukuba.ac.jp.
Escape character is '^]'.
012[←]
012
345[←]
345
^]
telnet> quit[←]
Connection closed.
$ []
クライアント側(その2)。
$ telnet cosmos10 1231 [←]
Trying 130.158.86.150...
Connected to cosmos10.coins.tsukuba.ac.jp.
Escape character is '^]'.
abc[←]
abc
def[←]
def
^]
telnet> quit[←]
Connection closed.
$ []

Last updated: 2012/06/04 16:10:48
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>