参考にしたページ
TechScoreに載っているEchoServerとEchoClientに関して、私なりに重要な部分を書き出してみる。
EchoServer
- ServerSocketとSocketを宣言
- ServerSocketとSocketを作成
- ソケット受信のストリームと、ソケット送信のストリームを作成
- インプットストリームを監視して、受信があった場合Echoする
- エラー処理、きちんとSocketとServerSocketは閉じる
の5つの処理しか行っていないので理解しやすいと思う。また、クライアントの処理も6つの処理だけである。
EchoClient
- Socketの宣言
- Socketの作成
- ソケットに対してのリーダーとライター、キー入力に対してリーダーを作成
- キー入力を監視し、入力があった場合それをソケットに書き出す
- また、ソケット入力を監視し、入力があった場合、標準出力に書き出す
- エラー処理
EchoServer.java
[java light=”true”]
import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;
public class EchoServer {
public static final int ECHO_PORT = 10007;
public static void main(String args[]) {
//①ServerSocketとSocketを宣言
ServerSocket serverSocket = null;
Socket socket = null;
try {
//②ServerSocketとSocketを作成
serverSocket = new ServerSocket(ECHO_PORT);
System.out.println("EchoServerが起動しました(port=" + serverSocket.getLocalPort() + ")");
socket = serverSocket.accept();
System.out.println("接続されました " + socket.getRemoteSocketAddress());
//③クライアントからのソケット受信のストリームと、クライアントへのソケット送信のストリームを作成
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
//④インプットストリームを監視して、受信があった場合Echoする
String line;
while ((line = in.readLine()) != null) {
System.out.println("受信: " + line);
out.println(line);
System.out.println("送信: " + line);
}
//⑤以下エラー処理、きちんとSocketとServerSocketは閉じる
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
}
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
}
}
}
}
[/java]
EchoClient.java
[java light=”true”]
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;
public class EchoClient {
public static final int ECHO_PORT = 10007;
public static void main(String args[]) {
//①Socketの宣言
Socket socket = null;
try {
//②Socketの作成
socket = new Socket(args[0], ECHO_PORT);
System.out.println("接続しました" + socket.getRemoteSocketAddress());
//③ソケットに対してのリーダーとライター、キー入力に対してリーダーを作成
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
//④キー入力を監視し、入力があった場合それをソケットに書き出す
//⑤また、ソケット入力を監視し、入力があった場合、標準出力に書き出す
String input;
while ((input = keyIn.readLine()).length() > 0) {
out.println(input);
String line = in.readLine();
if (line != null) {
System.out.println(line);
} else {
break;
}
}
//⑥以下エラー処理
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
}
System.out.println("切断されました " + socket.getRemoteSocketAddress());
}
}
}
[/java]