サーバーはIPアドレスとポート番号の情報で、クライアントからの待ち受け準備をします
クライアントでは、このサーバーのIPアドレスと、ポート番号に接続します
つまり、クライアントは接続したいソフトのポート番号が分からないと接続できないことになります。
サーバーでは、クライアントから接続を受け入れ(accept)する時、 そのクライアントと通信するための新しいソケットを作ります。
クライアントでは、サーバーが接続を受け入れした段階でより、通信が可能になります。
下記プログラムでは、接続後にクライアント側でキー入力した文字列を、サーバーに送信します。
この時、メッセージ送信を終える区切として、
CR(Carriage Return : 行頭復帰)、LF(Line Feed : 改行)コードを続けて2回送信しています。
サーバーでは、クライアントより受信した文字列にを表示した後、
キー入力した文字列を、クライアントに送信します。
クライアントでは、サーバーよりメッセージを受信し、その内容を表示した後で、 再びキー入力した文字列をサーバーに送信する繰り返しです。
以上のやり取りを行うサーバーとクライアントのプログラムを下記に示します。
import java.io.*; //InputStreamReaderやBufferedReaderを使えるようにする宣言 import java.net.*; //InetAddressやSoket利用のため public class Server2 { public static void main(String argv[]){ InputStreamReader is = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(is); byte crlf [] = {13,10};//キャリッジリターン(CR),改行(LF)の並び で、送信時の区切り用 try { //サーバー接続 InetAddress local = InetAddress.getLocalHost();//このマシンの情報取得 String localAdr = local.getHostAddress(); System.out.println("このマシンのIPアドレス" + localAdr); //サーバー用ソケットをポート80で作成 ServerSocket serverSock = new ServerSocket(80); //クライアントからの接続を待ち、接続してきたら、 // そのクライアントと通信するソケットを取得する。 Socket clientSock = serverSock.accept(); serverSock.close(); //クライアントからのリクエストメッセージ送信情報を受信して表示 InputStream sok_in = clientSock.getInputStream(); InputStreamReader sok_is = new InputStreamReader(sok_in); BufferedReader sok_br = new BufferedReader(sok_is); OutputStream os = clientSock.getOutputStream(); while(true){ String receive = sok_br.readLine();//受信データ取得 System.out.println(receive); receive = sok_br.readLine();//受信データ取得 System.out.println(receive); System.out.print("送信文字列>>"); String send = br.readLine(); //キー1行入力 os.write(send.getBytes());//送信 os.write(crlf); } } catch(Exception e){ System.out.println(e.toString()); } System.out.print(" Enterキーで終了"); try{System.in.read();}catch(Exception e){} } }
import java.io.*; //InputStreamReaderやBufferedReaderを使えるようにする宣言 import java.net.*; //InetAddressやSoket利用のため public class Client2 { public static void main(String argv[]){ InputStreamReader is = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(is); byte crlf [] = {13,10};//キャリッジリターン(CR),改行(LF)の並び で、送信時の区切り用 Socket socket;//ソケット try { System.out.print("接続するサーバーのIPアドレス入力>"); //追加 String IPAddress = br.readLine(); //キー1行入力 socket = new Socket( IPAddress , 80); //接続 OutputStream os = socket.getOutputStream(); InputStream sok_in = socket.getInputStream(); InputStreamReader sok_isr = new InputStreamReader(sok_in); BufferedReader sok_br = new BufferedReader(sok_isr); while(true){ System.out.print("送信文字列>>"); String send = br.readLine(); //キー1行入力 os.write(send.getBytes());//送信 os.write(crlf); os.write(crlf); String receive = sok_br.readLine();//受信データ取得 System.out.println("受信『" + receive + "』"); } } catch(Exception e){ System.out.println(e.toString()); } System.out.print(" Enterキーで終了"); try{System.in.read();}catch(Exception e){} } }