基本的なクライアントの動作は次のようになります。 なお、ストリームの説明は、ここをクリックください。
希望するサービスのサーバに、IPアドレスとポート番号で接続します。
それには、単に次のようなコンストラクタの実行で可能です。
この時、接続先IPアドレスの文字列の代わりにドメイン名も可能です
Socket socket = new Socket( IPアドレスの文字列 , ポート番号の数値 );
そして、次にサーバーへの送信用のストリーム(OutputStream)と、
受信用ストリーム(InputStream)を得ます。
サーバーと、アプリケーションプロトコルに従った、送信や受信を行います。
接続相手に送信する時は、
OutputStreamオブジェクト.write( バイト配列 )で行います。
また、1byteを受信する場合は、
InputStreamオブジェクト.read()の戻り値で得られます
なお、文字列受信ではbyte列⇔文字列の変換が必要となります。
ここで注意が必要なのは、通信相手の扱う文字列の
charsetが
何かということです。
日本語などで、これが合わないと文字化けが生じるからです。
通信が終わったら、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();
}
}