メッセージを受け取るサーバーを作る

受け取るサーバーと送るクライアント

前回作ったサーバーは接続してきたクライアントにメッセージを送るというものでした。

今回はメッセージを受け付けるサーバーを作ってみます。通信内容をコマンドライン引数として入れることで人同士の通信に使えます。

受けたメッセージを表示するだけのサーバー

送られてきたメッセージを表示するだけというサーバーです。このサーバーも 10001 ポートで待ちます。

プログラム名 Server02.java

/** 受けたメッセージを表示するだけのサーバー */
import java.net.*;
import java.io.*;
public class Server02 {
    public static void main( String[] args ) {
        int PORT = 10001;
        try {
            ServerSocket mysvsoc = new ServerSocket( PORT );
            while( true ) {
               //クライアントが接続してくるまで待ち続ける
                System.out.println( "Server02 waiting..." );
                Socket mysoc = mysvsoc.accept();
               //接続してきたホストの名前を表示
                String remotehost = mysoc.getInetAddress().getHostName();
                System.out.println(remotehost + " からメッセージです。:");
               // メッセージを受信
                InputStreamReader in
                    = new InputStreamReader(mysoc.getInputStream());
                BufferedReader inb = new BufferedReader(in);
                String line;
                while( ( line = inb.readLine() ) != null ){
                    System.out.println( line );
                }
                System.out.println();
                inb.close();
                in.close();
                mysoc.close();
            }
        }
        catch( IOException e ) {
            System.err.println("IO Error");
        }
    }
}

実行すると次のようになって接続を待ちます

$ java Server02
Server02 waiting...

まだサーバーしかなく接続してくるクライアントはありませんのでいつまでもこのままです。しかし,前回のClient01ではうまく通信できません。

Client02を作り、それで接続します。接続があると次のように相手のホスト名とメッセージを表示し,また待機状態に戻ります。

$ java Server02
Server02 waiting...
vineXX.st.seiai.ed.jp からメッセージです。:
Konnichihwa
hoge
desu.

Server02 waiting...

サーバーを停止するには ctrl+c (コントロールキーを押しながらc)で止めます。

これはしばらく止めずにおいて,端末(コンソール)を起動してクライアントを作りましょう。もう一度[アプリケーション]-[プログラミング]-[java]を選ぶのが一番簡単です。

クライアントプログラム

今回も 10001 を使いますが、今度は送信をするクライアントです。

プログラム名 Client02.java

/** メッセージを送りつけるクライアント */
import java.io.*;
import java.net.*;

public class Client02 {
    public static void main( String[] args ) {
        /** 通信に使用するポート番号 */
        int PORT = 10001;
        try {
            Socket mysoc = new Socket( args[0], PORT );
            OutputStreamWriter out = new OutputStreamWriter(mysoc.getOutputStream());
            BufferedWriter outb = new BufferedWriter(out);
            System.out.println( args[0]+" にメッセージを送ります。" );
            for( int i=1; i < args.length; i++ ) {
                 System.out.println( args[i] );
                 outb.write( args[i] );
                 outb.newLine();
            }
            outb.close();
            out.close();
            mysoc.close();
        }
        catch( UnknownHostException e ) {
            System.err.println( "Host not found" );
        }
        catch( IOException e ) {
            System.err.println("IO Error");
        }
    }
}

実行する時には、

$ java Client02 vineXX Konnichihwa hoge desu.

というように引数として通信したいホストの名前と、通信内容を引数として入れます。まずは自分の使っているコンピュータのホスト名でテストしましょう。

実行すると次のようにサーバーに送ったメッセージを自分の所にも表示します。(プログラムでわざわざ表示するようにしているからです。しないようにもできます)

$ java Client02 vineXX Konnichihwa hoge desu.
vineXX にメッセージを送ります。
Konnichihwa 
hoge 
desu.
$

引数はスペースで区切られて、args[0], args[1], args[2], ... に代入されますから、スペースは改行になってでます。必要に応じてクォーテーションでくくるとそれを防ぐことができます。


Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2008
Nov.2012