package j2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ThreadEchoServer implements Runnable {
Socket sock;
Thread thread;
ThreadEchoServer(Socket sc) {
sock = sc;
thread = new Thread(this);
thread.start(); // 別のスレッドでrun()を動作させる。メインのスレッドはrun()の終了を待たずにmain()に戻る
}
@Override
public void run() {
String line = null;
BufferedReader br = null;
PrintStream os = null;
System.out.println("accept");
try {
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
os = new PrintStream(sock.getOutputStream());
// クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
while ((line = br.readLine()) != null) {
System.out.println("(Server received) " + line);
os.println(line);
}
} catch (IOException e) {
// os.close();
System.out.println(e);
} finally {
System.out.println("disconnected " + sock.toString());
}
}
@SuppressWarnings("resource")
public static void main(String args[]) {
// ソケットの宣言
ServerSocket echoServer = null;
Socket clientSocket = null;
if (args.length < 2) {
args = new String[2];
args[0] = "127.0.0.1";
// ポート9999番を開く
args[1] = "9999";
}
String bindaddress = args[0];
int port = Integer.parseInt(args[1]);
try {
echoServer = new ServerSocket();
echoServer.bind(new InetSocketAddress(bindaddress, port)); // サーバソケットにバインドする=ポートでの待ち受け開始
} catch (IOException e) {
System.err.println(e);
System.err.println("バインド失敗。ポート番号 "+port+" (Bind-address: "+bindaddress+" 向け) がすでにつかわれているようです");
System.err.println("ポート番号またはバインドアドレスを変更してください。");
System.exit(1);
}
System.out.println("ThreadEchoServer ["+bindaddress+":"+port+"] started.");
while (true) {
// クライアントからの要求を受けるソケットを開く
try {
clientSocket = echoServer.accept();
} catch (IOException e) {
e.printStackTrace();
}
new ThreadEchoServer(clientSocket); //クライアントからの要求をスレッドで捌く
}
}
}