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

/**
 * <p>タイトル : Sv</p>
 * <p>説明     : 簡単サーバプログラム。</p>
 * <p><dl><dt>更新履歴 : </dt><dd><table>
 * <tr><td>1.0</td><td>新規作成。</td></tr>
 * </table></dd></dl></p>
 * @author bono
 * @version 1.0
 * @since 1.0
 */

public class Sv implements Runnable {

	private Socket sock_ = null;

	/**
	 * コンストラクタ
	 * @param sock クライアントと接続済みのソケットを渡す。
	 */
	public Sv(Socket sock) {
		this.sock_ = sock;
	}

	/**
	 * ファイナライザ
	 * 念のためソケットの破棄を行っている。
	 */
	protected void finalize() {
		try {
			sock_.close();
		} catch (Exception e) {}
	}

	/**
	 * クライアントに対し文字列を送信する。
	 */
	public void run() {
		try {

			DataOutputStream out = new DataOutputStream(sock_.getOutputStream());
			out.writeBytes("Hello!\n");
			sock_.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	/**
	 * スタートアップ
	 */
	public static void main(String[] args) {

		// 引数をチェックする。
		if (args.length != 1) {
			System.err.println("usage: java Sv port");
			return;
		}

		try {
			// サーバソケットの作成
			ServerSocket svsock = new ServerSocket(Integer.parseInt(args[0]));
			//svsock.setSoTimeout(10000); // accept() のタイムアウトが必要なときに設定する。
			for (;;) {
				// クライアントからの接続を受け付ける。
				Socket sock = svsock.accept();

				// クライアントとの入出力部分はスレッドとして起動する。
				Sv sv = new Sv(sock);
				Thread tr = new Thread(sv);
				tr.start();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}


}
