ネットクライアント

  1. 目的
    ネットクライアントは、ネットサーバーに接続しサーバーに情報を提供したり、サーバーから情報を受け取るネットワークソフトです。アプレットは一般に他のサーバーとは接続できませんが、webサーバーと同じサーバーに限り、接続が可能です。

  2. サーバー&クライアントモデル
    1. サーバー&クライアント
       サーバーに接続し、ネットワークを経由してデータを交換できるソフトをネットワーククライアント(依頼人)といいます。ここでは、TCP/IPを利用しソケットクラスを利用してデータをサーバーに送るクライアントのプログラムを紹介します。

    2. IP番号
        IP番号はインターネットに接続するホストにユニークに割り当てられている4バイトの番号です。IP番号は、
      150.42.41.1 のように、0..255の数字を4組ならべて指定します。アプレットの場合、接続先は アプレットのページを提供するサーバーに限定され、以下のように、URLクラスを介して、url.getHost( ); で取得できます。
         URL url = getCodeBase( );   // アプレット自身の基底URL取得
         String host = url.getHost( ); 
         int port = 8005;  

    3. ポート番号
       IP番号は、インターネットに接続する特定のホスト(計算機)を指定しますが、これだけでは、サーバーのプログラムを識別できません。ホストのネットワークプログラムはポート番号で識別されます。たとえば、80 はwebのサーバーですし、23 はメールサーバーのポート番号です。
       1000番以下のポート番号は予約されています。ここでは 8005 番を利用します。

    4. ソケット
       ソケットは、ネットワークを介してデータをやりとりする「接続口」です。host:IP番号と8005:ポート番号 を指定して、ソケットクラスのオブジェクトを作成します。

       Socket socket = null;
       socket = new Socket(host, port);
       OutputStream outputstream = socket.getOutputStream( );

      このソケットから、ファイルの場合とどうよう、文字列を送ることができます。

    5. 文字ののデータ出力
       ソケットからファイルの場合とどうように、 OutputStream のオブジェクト:outputstream を取り出すことができます。さらに、outputstream から、PrintStream() を取り出し、PrintStream のオブジェクト:netoutput を作成します。これは、ファイルの場合とどうような処理になります。

       OutputStream outputstream = socket.getOutputStream( );
       netoutput = new PrintStream(outputstream);
       netoutput.println("hello");
       netoutput.flush( );

      ここでは、netoutput に対し、println() で "hello" の1行をサーバーに書き出します。しかし、ネットワークは、一般にある程度の大きさのデータが集まってから、実際のデータを出力します。 flush( ); はこれまでに書き出された内容を、強制的にネットワークに送り出すします。

    6. ネットワークを閉じる
      ファイルとどうよう、close() で、ソケットやストリームを閉じることができます。
       
       netoutput.close( );
       socket.close( );

    7. 掲示板プログラムへの拡張
       ここでは、サーバーは送られた文字列をファイルに記録します。記録したファイルを読み出しことができれば、掲示板の機能が実現できます。サーバーのファイルを読み出すには、この項を参照して下さい。

    8. ファイアーウオールに注意
       最近、ルータやPCでは、特定のポート番号のみを通過させ、それ以外のデータをブルックっする、ファイヤーウオールの機能が組み込まれています。この場合、ここで利用している ポート番号 8005 のデータはブロックされ、サーバーに到着しません。
       実験をする場合、ルーターで 指定したポート番号を通過させる設定が必要です。

  3. プログラム
    1. 構成
      ソケットを利用して、文字枠(textField)に入力された文字列を、送信ボタンで、サーバーに送ります。
      init() で、TextArea や 送信 Button のオブジェクトを生成します。

      send_actionPerformed() はボタンのイベント処理を行うメソッドで、ネットワークを介してサーバーに文字列を送ります。
      サーバーのプログラムは、別項で紹介します。

    2. プログラム
       
      iimport java.applet.*;     // Applet
      import java.awt.*;        // Font, TextField, TextArea, Label, Color, Button
      import java.awt.event.*;    // ActionListener, ActionEvent
      import java.io.*;       // InputStream, InputStreamReader, BufferedReader etc
      import java.net.*;        // Socket, URL, URLConnection, UnknownHostException etc
      
      
      public class netClient extends Applet  {
      
        TextArea InputArea;               // 内容入力エリア
        Button SendButton;                // 送信ボタン
      
      
        // 初期化処理 -----------------------------------------------------------------------
        public void init( ) {
      
          setLayout(null);              // 自由レイアウト設定
          // 内容入力エリア
          InputArea = new TextArea(2, 40);      add(InputArea); 
          InputArea.setBounds(10, 10, 220, 70);
          
          // 送信ボタン
          SendButton = new Button("送信");
      
          SendButton.setBounds(50, 100, 50, 20);
      
          add(SendButton,null);
          add(InputArea,null);
          
          SendButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
           send_actionPerformed( e); } });
              
        }
        
        // 送信処理 ----------------
        void send_actionPerformed(ActionEvent e) {  
          Socket socket = null;   
          PrintStream netoutput;    
      
          try {
            URL url = getCodeBase( );   // アプレット自身の基底URL取得
            String host = url.getHost( ); 
            int port = 8005;        // ポート 8005
      
            try {
              socket = new Socket(host, port);  // ソケット
            } catch (UnknownHostException e1) {
              System.out.println("Not able to connect, sorry \n");
            }
      
            // ソケットから出力ストリームを作成
            OutputStream outputstream = socket.getOutputStream( );
            // 出力ストリームからデータ出力ストリーム作成
            netoutput = new PrintStream(outputstream);
      
            // 内容送信
            netoutput.println(InputArea.getText()); // Stringデータを UTF 形式で出力
            netoutput.println("end");
            netoutput.flush( );           // バッファ内データを強制的に出力
      
            netoutput.close( );           // ネット経由出力ストリームクローズ
            socket.close( );            // ソケットクローズ
          }catch(IOException e2) {            // 例外処理
          }
        }
      }

    3. 実行
       まず、サーバーを起動しておきます。文字を入力し、「送信」ボタンを押すと、入力した文字列がサーバーに送られます。