TCP Client プログラミング1 Java編

TCP(Transmission Control Protocol)プログラミング レイヤー4のプロトコルで、TCPのクライアントプログラムの実験します TCPはサーバとなる相手に、接続して相手がいることを確認後に送受信を行うプロトコルです。よって、まず接続処理を行います。また、確実に送るための制御を行っています。 以下に最初のクライアント用のプログラムを示します。

01
02
03
04
05
06
07
08
09
10 11
12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
30 31
32
33
34
import java.io.*;
import java.net.*;

public class TcpClient1 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		Socket socket = new Socket("192.168.0.33", 49154);

		InputStream is = socket.getInputStream();
		BufferedReader sr = new BufferedReader(new InputStreamReader(is));
		OutputStream os = socket.getOutputStream();

		String s = sr.readLine(); //ソケットストリームから入力

		System.out.println(s);//入力文字列を表示

		System.out.print("send message>");
		s = br.readLine();//1行のキー入力
		s = s + "\r\n";
		byte[] data;
		data = s.getBytes();//入力した文字列を
		os.write(data);//ソケットストリームへ書き込み
		os.flush();//送信してない情報があれば、全て送信する。

		os.close();//出力ストリームを閉じる
		sr.close();//入力ストリームを閉じる
		socket.close();//ソケットを閉じる
		System.out.print("Press Enter Key");
		System.in.read();
	}
}

実行で、IPアドレスやポートがサーバと合わない場合やサーバが動作していない場合に次の実行エラーを確認ください。上記の09行で起きます。
Exception in thread "main" java.net.ConnectException: Connection refused: connect
これは、new Socket("192.168.0.33(ここは変更)", 49154); のコンストラクタ実行内でサーバへの接続(Connection)動作を行うのですが、それに失敗した意味です。
このようにTCPでは、相手のサーバが存在して、通信可能(接続可能)かの確認を行って、可能の場合に、そのソケット(出入り口)を使って、送受信します。
上記場合は、15行目のsr.readLine();で受信をしてから、24行目のos.write(data);で入力文字列の送信しています。この順番とサーバ動作が合わないと正しく動作できません。
(クライアントが送信なら、サーバーは受信していなければならなりません)
09接続終了の段階で、自身の送信や受信に使うポート番号は、まだ使われていないポート番号が適当に選ばれて使われます。
そこで、new Socket("192.168.0.33", 49154); の直後に、以下を追加して確認しましょう。

		System.out.println("自身のIPアドレス:" + socket.getLocalAddress());
		System.out.println("自身が使うポート:" + socket.getLocalPort());
		System.out.println("相手が使うポート:" + socket.getPort());