メッセージを加工して送り返すサーバー

受け取るのも送るのも

今回はメッセージを受けとったあと,返事をするサーバーを作ってみます。受信,送信を両方するというところがポイントです。

クライアントも送信した後受信をするように作らなければなりません。

返事をするサーバー

このサーバーも 10001 ポートで待ちます。

プログラム名 Server03.java

/** 受信後返事をするサーバー */
import java.net.*;
import java.io.*;
public class Server03 {
    public static void main( String[] args ) {
        int PORT = 10001;
        String henji = "hoge: ok";
        try {
            ServerSocket mysvsoc = new ServerSocket( PORT );
            while( true ) {
                System.out.println( "waiting..." );
                Socket mysoc = mysvsoc.accept();
                String remotehost = mysoc.getInetAddress().getHostName();
                System.out.println(remotehost + ":");
                OutputStreamWriter out
                  = new OutputStreamWriter(mysoc.getOutputStream());
                BufferedWriter outb = new BufferedWriter(out);
                InputStreamReader in 
                  = new InputStreamReader(mysoc.getInputStream());
                BufferedReader inb = new BufferedReader(in);

                String line;
                line = inb.readLine();
                System.out.println( line );
                outb.write( henji, 0, henji.length() );
                outb.newLine();
                outb.flush();

                inb.close();
                in.close();
                outb.close();
                out.close();
                mysoc.close();
            }
        }
        catch( SocketException e ) {
            System.err.println("Socket Error");
        }
        catch( IOException e ) {
            System.err.println("IO Error");
        }
        catch( java.lang.Exception e ){
            System.out.println(e.toString());
        }
    }
}

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

$ java Server03
waiting...

まだサーバーしかなく接続してくるクライアントはありませんのでいつまでもこのままです。しかし,接続があると次のように相手のホスト名とメッセージを表示し,また待機状態に戻ります。

$ java Server03
waiting...
vineXX:
Konnichihwa
waiting...

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

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

クライアントプログラム

今度もポート 1001 を使います。サーバーと逆で、送信した後に受信するように作ります。

プログラム名 Client03.java

/** 送信後受信するクライアント */
import java.io.*;
import java.net.*;
public class Client03 {
    public static void main( String[] args ) {
        int PORT = 10001;
        try {
            Socket mysoc = new Socket( args[0], PORT );
            InputStreamReader in 
                  = new InputStreamReader(mysoc.getInputStream());
            BufferedReader inb = new BufferedReader(in);
            OutputStreamWriter out
                  = new OutputStreamWriter(mysoc.getOutputStream());
            BufferedWriter outb = new BufferedWriter(out);

            outb.write( args[1], 0, args[1].length() );
            outb.newLine();
            outb.flush();
            String line;
            line = inb.readLine();
            System.out.println( line + "<-" );

            outb.close();
            out.close();
            inb.close();
            in.close();
            mysoc.close();
        }
        catch( ArrayIndexOutOfBoundsException e ) {
            System.err.println("Usage:java Client03 hostname message");
        }
        catch( UnknownHostException e ) {
            System.err.println( "Host not found" );
        }
        catch( SocketException e ) {
            System.err.println("Socket Error");
        }
        catch( IOException e ) {
            System.err.println("IO Error");
        }
    }
}

実行する時には、

$ java Client03 vineXX Konnichihwa.

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

実行すると次のようにサーバーの返答があります。

$ java Client03 vineXX Konnichihwa.
hoge: ok<-
$

課題

クライアントの送ってきた文字列を [ ] で囲んで返すように変えてみましょう。

プログラム名 Server031.java

クライアントは同じものが使えます。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified