javaソケットの基本

この記事は約6分で読めます。

参考にしたページ

TechScoreに載っているEchoServerとEchoClientに関して、私なりに重要な部分を書き出してみる。

EchoServer

  1. ServerSocketとSocketを宣言
  2. ServerSocketとSocketを作成
  3. ソケット受信のストリームと、ソケット送信のストリームを作成
  4. インプットストリームを監視して、受信があった場合Echoする
  5. エラー処理、きちんとSocketとServerSocketは閉じる

の5つの処理しか行っていないので理解しやすいと思う。また、クライアントの処理も6つの処理だけである。

EchoClient

  1. Socketの宣言
  2. Socketの作成
  3. ソケットに対してのリーダーとライター、キー入力に対してリーダーを作成
  4. キー入力を監視し、入力があった場合それをソケットに書き出す
  5. また、ソケット入力を監視し、入力があった場合、標準出力に書き出す
  6. エラー処理

 

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]

タイトルとURLをコピーしました