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)