Shammer's Philosophy

My private adversaria

Java Socket API Sample1(EchoServer)

単純に、クライアントから受け取ったメッセージをそのままクライアントに返すだけのサンプルを作成。
と言っても、http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06520-0の内容をほとんど真似たもの。
ソースコードも上記サイトより入手できるようだ。

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;

public class TCPEchoServer {
  private static final int BUFFER_SIZE = 256;
  public static void main(String[]args)throws java.io.IOException {
    if( args.length != 1 ) {
      System.err.println("Usage: java TCPEchoServer <PORT>");
      System.exit(1);
    }
    int serverPort = Integer.parseInt(args[0]);
    ServerSocket serverSocket = new ServerSocket(serverPort);
    int receiveMessageSize = 0;
    byte[] byteBuffer = new byte[BUFFER_SIZE];
    for(;;) {
      System.out.println("Waiting client request...");
      Socket clientSocket = serverSocket.accept();
      String host = clientSocket.getInetAddress().getHostAddress();
      System.out.println("Handling client at " + host + " on port " + clientSocket.getPort());
      InputStream in = clientSocket.getInputStream();
      OutputStream out = clientSocket.getOutputStream();
      while( (receiveMessageSize = in.read(byteBuffer)) != -1 ){
        String receiveMessage = new String(byteBuffer);
        System.out.println("byteBuffer:" + receiveMessage);
        out.write(byteBuffer, 0, receiveMessageSize);
      }
      try {
        System.out.println("close client socket...");
        clientSocket.close();
      }
      catch( Exception e ) {
        e.printStackTrace();
      }
    }
  }
}

これを拡張して、クライアントに送信するメッセージサイズを先に伝えて、
クライアント側ではその分のメッセージを受信した後でコネクションを閉じる、
というように拡張して行きたい。やり取りするメッセージが文字列だけとわかっていれば、
もう少し実装も簡単にできそうだが、バイナリデータもやり取りできるようにしたいので、
あえてjava.io.InputStreamとjava.io.OutputStreamにこだわって試したい。
目指すのは、超簡易HTTPサーバーというところだろうか・・・