[ Top ] > [ Communication ] > [ study ] > [ Java ]
>Stream-4-
a
 
 

Stream-4- サーバ

今まで、ファイル、キーボード、そして、モニタをストリームを使って出力したり、読み込んだりしました。
このストリームは、ネットワークに対しても出来るようです。
と、言うより、Java自体が出力や読み込みをストリームを使う。と、言うべきなのかもしれませんが・・・。
HTTPサーバも、SMTPサーバも常時稼働していて外部からのアクセスを待っているわけなんですけど、これをJavaで行うには、
ServerSocketクラスを使用します。
え〜と、ServerSocketクラスとは・・・、「サーバソケットを実装するクラスです。サーバソケットは、ネットワークを介して要求が送られてくるのを待ちます。その要求に基づいて処理を行い、場合によっては要求元に結果を返します。 受信する接続 (接続要求) の待ち行列の最大長は50です。」と、いうことらしいですね。

(例外)

IOException : ソケットを開いているときに入出力エラーが発生した場合
SecurityException : セキュリティマネージャが存在し、セキュリティマネージャの checkListen メソッドがこの操作を許可しない場合

コンストラクタの概要を見ると、引数の数などによって、いろいろな動作をするようですね。
int型で、ポート番号をしてやればそのポート番号サーバソケットを作成します。

実際に待ち受けるには、ServerSocketクラスのacceptメソッドを使用します。引数はいらないようですね。

簡単なサーバを作ってみました。

> server00.java
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*; // InputStreamクラスをを使うのに必要

class server00{
 public static void main(String args[ ]){
  byte[ ] buf = new byte[64];
  int k;
  InputStream inStream;
  try{
   ServerSocket ss = new ServerSocket( 8080 );
   Socket sock = ss.accept( );
   inStream = sock.getInputStream( );
   k = inStream.read( buf );
   System.out.write( buf , 0 , k );
  }catch( IOException e ){
  }
 }
}

これを実行させたら、「 ctrl + C 」を押すまで反応がなくなるので、もう一つコマンドプロンプトを立ち上げて、「 a 」と入力してみてください。

>telnet localhost 8080
a ←入力した
>

こちらの方は、なにも反応無しで終了しますが、サーバ側の方は「 a 」と表示されているはずです。

次に、受け取った文字をそのまま返すように改造してみました。とはいっても、単に InputStreamがあるんなら OutputStream もあるんじゃないかなぁ。と思って書いてみただけです。

> server00.java
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*; // InputStreamクラスをを使うのに必要

class server00{
 public static void main(String args[ ]){
  byte[ ] buf = new byte[64];
  int k;
  InputStream inStream;
  OutputSteam outStream;
  try{
   ServerSocket ss = new ServerSocket( 8080 );
   Socket sock = ss.accept( );
   inStream = sock.getInputStream( );
   outStream = sock.getOutputStream( );
   k = inStream.read( buf );
   outStream.write( buf , 0 , k);
   System.out.write( buf , 0 , k );
  }catch( IOException e ){
  }
 }
}

>telnet localhost 8080
a ←入力した
a ←返ってきた
ホストとの接続が切断されました。
>

たとえば、

  While(true){
   k = inStream.read( buf );
   outStream.write( buf , 0 , k);
   System.out.write( buf , 0 , k );
  }

キーボードの時のように、上のようにすればやればうまくいきそうな気がしますが、たとえば「こんにちわ」と、うとうとしても、1文字打つたびに同じ文字が返ってきてしまいます。
詳しくはわかりませんが、telnet は、1文字打つごとに送信してしまうみたいです。
ただし、telnet は、コピペが出来ないようなので、たとえば、ブラウザのアドレス入力欄に
http://localhost:8080
と、入力してアクセスすると、

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjapeg
                  ・
                 省略
                  ・
Host: localhost:8080
Connection: Keep-Alive

と、サーバ側で表示されるはずです。

> server00.java

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*; // InputStreamクラスをを使うのに必要

class server00{
 public static void main(String args[ ]){
  byte[ ] buf = new byte[64];
  String s
  InputStream inStream;
  InputStreamReader i;
  BufferedReader bf;
  try{
   ServerSocket ss = new ServerSocket( 8080 );
   Socket sock = ss.accept( );
   inStream = sock.getInputStream( );
   i = new InputStreamReader( inStream );
   bf = new BufferedReader( i );
   s = bf.readLine( );
   System.out.println( s );
  }catch( IOException e ){
  }
 }
}