java.net.ServerSocket

目的
シンプルなマルチスレッドサーバを作る。

関連クラス

今回のソース
////////////////////  Main.java  ////////////////////

// Main.java

public class Main
{
	public static void main(String args[])
	{
		new DateServer();
	}
}

////////////////////////////////////////////////////////////

////////////////////  DateServer.java  ////////////////////

// DateServer.java

import java.io.IOException;
import java.net.*;

public class DateServer
{
	// クライアントからの接続を受け付けるポート番号
	public static final int server_port = 2000;

	// デフォルトのサービスを提供する時間(秒)
	private final int exec_sec = 10;

	ServerSocket server_socket;

	public DateServer()
	{
		try
		{
			server_socket = new ServerSocket(server_port);

			// クライアントの接続を待つループ
			while(true)
			{
				Socket socket = server_socket.accept();
				new DateThread(socket, exec_sec).start();
			}
		}
		catch(IOException io_ex)
		{
			io_ex.printStackTrace();
		}
	}
}

////////////////////////////////////////////////////////////

////////////////////  DateThread.java  ////////////////////

// DateThread.java

import java.io.*;
import java.net.Socket;
import java.text.DateFormat;
import java.util.Date;

public class DateThread extends Thread
{
	// クライアントのソケット
	private Socket socket;

	// サービスを提供する時間
	private int exec_sec;

	public DateThread(Socket socket, int exec_sec)
	{
		this.socket = socket;
		this.exec_sec = exec_sec;
	}

	// 日付/時刻をクライアントへ送り返す処理
	public void run()
	{
		try
		{
			PrintWriter writer = new PrintWriter(socket.getOutputStream());

			for(int i=0; i<exec_sec; i++)
			{
				DateFormat date_format = DateFormat.getDateTimeInstance();
				String date_string = date_format.format(new Date());
				writer.println(date_string);
				writer.flush();

				Thread.sleep(1000);
				Thread.yield();
			}

			writer.println("Disconnect by Server");
			writer.flush();
			socket.close();
		}
		catch(IOException io_ex)
		{
			io_ex.printStackTrace();
		}
		catch(InterruptedException interrupted_ex)
		{
			interrupted_ex.printStackTrace();
		}
	}
}

////////////////////////////////////////////////////////////
Source is here. (ZIP Format, 1324Byte, Shift-JIS)

コンパイル&実行
javac Main.java
java Main もしくは、 start java Main (Windows) java Main & (UNIX)

説明
(概略)

サーバーの日付/時刻を10秒間(Default)クライアントに送信するサーバーです。
目的どおり、マルチスレッドなサーバーで、シンプルな機能を提供するものが
出来たのではないかと思います。

実際に、複数クライアントから接続されたとしても、
それぞれのクライアントに対して、サーバーからスレッドが生成され、
そのスレッドがクライアントの相手をするので、
複数のクライアントを処理することが出来ます。(下図参照)

ServerSocketの説明


つまり、サーバーはクライアントの受付窓口に過ぎず、
実際にクライアントと通信するのは、
サーバーから生成されたスレッドということになります。

(サンプルプログラムの説明)

Thread.yield();
他のスレッドに実行権を譲るためのメソッドですが、
sleepを呼び出せば、自動的に実行権が変わることが多いそうです。
(よく分かってない(^^;)