TCPやUDPなどのトランスポート用インターフェイス(上位層からアクセス方法)として、 ソケットインターフェイスが存在します。
これは、元々BSD Unixで開発されたものですが、現在ではほとんどのOSで使われています。
そしてJavaでは、TCP通信(サーバー、クライアント共に)に使うクラスが Socketの名前になっています。
また、接続待機用のTCPサーバー用クラス名が、ServerSocketになっています。

Javaを使ったサーバーとクライアントプログラム

接続要求を待機するサーバーのプログラム

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)