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サーバーというところだろうか・・・