Java ServerSample.java および ClientSample.java
Javaによるチャットサーバーとクライアントの原型サンプルソース。
サーバーはクライアントからの接続を待ち、接続が行なわれたらクライアントから1行のデータを受け取り、
表示して接続を切断し、次の接続を待つ。もし、end が送られてきた場合にはプログラムを終了する。
クライアントはサーバーに接続し、メッセージを送信する。サーバーアドレスはコマンドラインの第1引数で指定。
ポートは30000に固定。第2引数で、メッセージを指定する。一行送ってプログラム終了する。endを指定すると、サーバーも停止する。
実際にインターネット越しに通信する場合は、使用ポートを開けておく等、ファイアウォールの設定変更が必要になります。
複数クライアントからの接続に対応したGUI版サーバーは、http://www.sys9.org/java25.phpをご覧ください。
//Socket通信サンプルプログラム(サーバー) //クライアントからの接続を待ち、接続が行なわれたら //1行のデータを受け取り、表示して接続を切断し、 //次の接続を待つ。 もし、end が送られてきた場合には //プログラムを終了する。 import java.net.*; import java.io.*; class ServerSample { public static void main(String[] args) { try { // ポート番号は、30000 //ソケットを作成 ServerSocket serverSoc = new ServerSocket(30000); boolean flag=true; //クライアントからの接続を待機するaccept()メソッド。 //accept()は、接続があるまで処理はブロックされる。 //もし、GUIプログラムなどで、待機中も他の処理を行う必要があるときは //スレッドを使う。 //accept()は接続時に新たなsocketを返す。これを使ってクライアントとの通信を行なう。 Socket socket=null; while(flag){ System.out.println("Waiting for Connection. "); socket = serverSoc.accept();//接続があるまで待機に入る //接続があれば次の命令に移る。 System.out.println("Connect to " + socket.getInetAddress()); //socketからのデータはInputStreamReaderに送り、さらに //BufferedReaderによってバッファリングする。 BufferedReader reader = new BufferedReader (new InputStreamReader(socket.getInputStream())); //読み取ったデータを表示する。 String line = reader.readLine(); System.out.println("Message from client :" + line); //入力ストリームをクローズする。 reader.close(); //通信用ソケットの接続をクローズする。 socket.close(); //待ち受け用ソケットをクローズする。 if(line.matches("end")){ serverSoc.close(); flag=false; System.out.println("Stopped."); } } } catch (IOException e) { e.printStackTrace(); } } } //************ここまで、サーバーソフト。 //************以下、クライアントソフト。 //クライアントサンプルプログラム //サーバーに接続し、メッセージを送信する。 //サーバーアドレスはコマンドラインの第1引数で指定。 //ポートは30000に固定。 //第2引数で、メッセージを指定する。一行送ってプログラム終了する。 //endを指定すると、サーバーも停止する。 import java.net.*; import java.io.*; class ClientSample { public static void main(String[] args) { try { //アドレス情報を保持するsocketAddressを作成。 //ポート番号は30000 InetSocketAddress socketAddress = new InetSocketAddress(args[0], 30000); //socketAddressの値に基づいて通信に使用するソケットを作成する。 // Socket socket = new Socket(); //タイムアウトは10秒(10000msec) socket.connect(socketAddress, 10000); //接続先の情報を入れるInetAddress型のinadrを用意する。 InetAddress inadr; //inadrにソケットの接続先アドレスを入れ、nullである場合には //接続失敗と判断する。 //nullでなければ、接続確立している。 if ((inadr = socket.getInetAddress()) != null) { System.out.println("Connect to " + inadr); }else { System.out.println("Connection failed."); return; } //メッセージの送信処理 String message = args[1]; //PrintWriter型のwriterに、ソケットの出力ストリームを渡す。 PrintWriter writer = new PrintWriter(socket.getOutputStream()); System.out.println("Send message: " + message); //ソケットから出力する。 writer.println(message); //終了処理 writer.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }