TCPやUDPなどのトランスポート用インターフェイス(上位層からアクセス方法)として、
ソケットインターフェイスが存在します。
これは、元々BSD Unixで開発されたものですが、現在ではほとんどのOSで使われています。
そしてJavaでは、TCP通信(サーバー、クライアント共に)に使うクラスが
Socketの名前になっています。
また、接続待機用のTCPサーバー用クラス名が、ServerSocketになっています。
ServerSocketクラスを次のように使います。
コンストラクタで 49152のポート番号を指定し、
acceptメソッドでクライアントからの接続要求を待ちます。
ですから、さきにサーバーを起動します。
そしてサーバーでは、クライアントから接続を受け入れ(accept)する時、
そのクライアントと通信するための新しいSocketオブジェクトを作ります。
import java.io.*; import java.net.*; public class TcpServer1{ public static void main(String []args)throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //サーバー用ソケットをポート49152で作成 ServerSocket serverSock = new ServerSocket(49152); //クライアントからの接続を待ち、接続してきたら、 // そのクライアントと通信するソケットを取得する。 Socket clientSock = serverSock.accept(); System.out.println(clientSock.toString() + ":connected"); //クライアントと通信するためのストリームを作成 InputStream client_is = clientSock.getInputStream(); BufferedReader client_br = new BufferedReader(new InputStreamReader(client_is)); OutputStream client_os = clientSock.getOutputStream(); //クライアントへ送信 byte []data; String msg = "hello!\n"; data = msg.getBytes(); client_os.write(data); client_os.flush(); //クライアントから受信 msg = client_br.readLine(); System.out.println("receive:" + msg); client_is.close();//閉じる client_os.close(); clientSock.close(); System.out.print("Press Enter Key"); br.readLine(); } }
acceptで得られた相手と通信するための、
Socketオブジェクトの使い方は、クライアント側のSocketと
変わりません。
この例では、接続してきたクライアントに、"hello!\n"のメッセージを送信し、
その後でクライアントからの送信データを表示して終了します。
サーバーに接続すると、サーバーから送られた文字列1行を、受信して表示し、 キー入力した文字列をサーバーに送信して終了しています。
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.zz.xxx", 49152);//(サーバーのIPアドレスに変更) 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(); 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(); } }
この実行前にサーバーのプログラムを実行しておきます。
また、上記プログラムで、
socket = new Socket( "192.168.zz.xxx", 49152)の
"192.168.zz.xxx"の部分が接続先サーバーの
IPアドレスです。
よって、サーバーのIPアドレスを調べて、それに合わせる変更が必要です。
参考資料 Windowsにおける「ソケットの最大数」と「TIME_WAITの時間」のレジストリ設定キーを示します。
ソケットの最大数(5,000〜65,534の間で設定):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort (DWORD)
TIME_WAITの時間(30〜300秒の間で設定):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay (DWORD)