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