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());