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();
}
}
}
