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 |