TCP 基本クライアントプログラム Java編

基本的なクライアントの動作は次のようになります。 なお、ストリームの説明は、ここをクリックください。

  1. 希望するサービスのサーバに、IPアドレスとポート番号で接続します。
    それには、単に次のようなコンストラクタの実行で可能です。 この時、接続先IPアドレスの文字列の代わりにドメイン名も可能です
    Socket socket = new Socket( IPアドレスの文字列 , ポート番号の数値 );

    そして、次にサーバーへの送信用のストリーム(OutputStream)と、 受信用ストリーム(InputStream)を得ます。

  2. サーバーと、アプリケーションプロトコルに従った、送信や受信を行います。
    接続相手に送信する時は、
     OutputStreamオブジェクト.write( バイト配列 )で行います。
    また、1byteを受信する場合は、
     InputStreamオブジェクト.read()の戻り値で得られます

    なお、文字列受信ではbyte列⇔文字列の変換が必要となります。
    ここで注意が必要なのは、通信相手の扱う文字列の charsetが 何かということです。
    日本語などで、これが合わないと文字化けが生じるからです。

  3. 通信が終わったら、socket.close() で接続を閉じなければなりません。

以下に 文字列を送受信できるサーバーに対して、接続し、
コンソール画面からキー入力した1行を送信して、
サーバーから1行受信してそれを表示し、
接続を閉じるプログラムを示します。

import java.io.*;	//入出力(OutputStream,InputStream)用
import java.net.Socket;//ソケット用

public class TestTcpSendRec
{
	public static void main(String []args)throws Exception
	{
		Socket socket = new Socket("192.168.0.33", 49152);		
		OutputStream os = socket.getOutputStream();//送信用バイトストリーム取得
		InputStream is = socket.getInputStream();//受信用バイトストリーム取得

		System.out.println("キー入力>");
		java.util.Scanner stdin = new java.util.Scanner(System.in);//キー入力用
		String keyStr = stdin.nextLine();//1行キー入力文字列

		//1行の keyStr文字列送信 
		byte[] data = keyStr.getBytes();//バイト列に変換(デフォルトのcharset)
		os.write(data);					//接続相手にバイト出力
		os.flush();//未出力データを、残らず出す。

		//1行受信の処理
		int c;
		byte [] buf = new byte[1028];//受信バイト列蓄え用
		int n = 0;
		while (n < buf.length && (c = is.read()) != -1){//ストリーム終端で終了
			if (c == 0x0A) break;// LF の改行なら終了
			buf[n++] = (byte) c;
		}
		String recStr = new String(buf, 0, n, "Shift_JIS");//"Shift_JIS"のcharsetでbyte列から文字列変換
		System.out.println("『" + recStr + "』の文字列受信");
		
		//接続を閉じる
		os.close();//閉じる
		is.close();
		socket.close();
	}
}