ServerSocketから新しい接続を受け付ける度に、新しいスレッドを生成し、 そのスレッドにクライアントの処理を任せます。
スレッドを使うには、Threadのサブクラスを生成するか、またはRunnableを implementsしたクラスが必要になります。 ここでは EchoHandlerというRunnableをimplementsしたクラスを作成しています。
RunEchoServerThreaded.javaの実行例(サーバ) |
$ javac RunEchoServerThreaded.java |
実行例(クライアント0) |
$ java RunTelnetClient localhost 8888 |
実行例(クライアント1) |
$ RunTelnetClient localhost 8888 |
実行例(クライアント2) |
$ java RunTelnetClient localhost 8888 |
上記の EchoServerThreaded.javaはわかりやすさを優先して書いたものです。 個々のクライアントを生成する部分は、3行をまとめて1行で書くことができます。
EchoServerThreaded.javaの別の書き方 |
import java.net.*; import java.io.*; public class EchoServerThreaded { ServerSocket servSock; public EchoServerThreaded(int port) { try { servSock = new ServerSocket(port); } catch (IOException e) { System.err.println("IO Error " + e); } } public void run() { Socket sock = null; int id=0; try { while (true) { sock = servSock.accept(); System.out.println("accept from "+sock.getInetAddress()); new Thread(new EchoHandler(sock,id++)).start(); } } catch (IOException e) { System.err.println("IO Error " + e); } } } |
提出〆切は次回の授業の開始時間です。
提出先 | http://ynitta.com/class/network/local/handin/list.php?id=kadai5a |
---|---|
提出ファイル | MyServerHandler.java |
コメント欄 | "400 Error\r\n"や "200 Ok\r\n"+「ファイルの内容」 が送られてきている状況を表すクライアント側の実行例。 コピー&ペーストで貼りつけて置くこと。 |
8888番ポートで接続を受け付けるサーバを作成しなさい。 クライアント毎にスレッドを生成して、クライアントからの要求を処理すること。
クライアントからの要求は、行単位で送られてくる。 行は1個以上の空白文字で区切られた文字列から構成されている。 クライアントから送られてきた行がこのサーバは簡単のためにセキュリティを高める工夫はしていません。 本来は、特定のフォルダ(ディレクトリ)よりも上の階層のファイルには アクセスできないように、
RunMyServer.javaの実行例(サーバ) |
$ java RunMyServer |
RunTelnetClient.javaの実行例(クライアント) |
$ java RunTelnetClient localhost 8888 |