サーバーは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){}
}
}