/*
 * $Id: RandomTextServer.java,v 1.2 2005/05/15 03:53:36 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 */
package org.logical_paradox.testsite.async;

import java.nio.channels.SelectionKey;
import java.util.HashMap;
import java.util.Vector;

import org.logical_paradox.common.net.async.CAsyncClientSocket;
import org.logical_paradox.common.net.async.CAsyncSocket;
import org.logical_paradox.common.net.async.Multiplexer;
import org.logical_paradox.common.util.StringUtils;


/**
 * ランダムテキストサーバー
 * ランダムな文字列を返す
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public final class RandomTextServer {
	/** デフォルトのポート番号 */
	public static final int DEFAULT_LISTENING_PORT = 1234;

	/** マルチプレクサ */
	private Multiplexer multiplexer = null;

	/**
	 * デフォルトコンストラクタ
	 */
	public RandomTextServer() {
	}

	/**
	 * サーバーを開始する
	 * @throws Exception ハンドリングされなかった例外
	 */
	public void startServer() throws Exception {
		// サーバーモードでマルチプレクサを生成する
		HashMap m = new HashMap();
		m.put(Multiplexer.KEY_SERVER_SOCKET_FACTORY, new CAsyncServerSocketFactoryImpl());
		m.put(Multiplexer.KEY_CLIENT_SOCKET_FACTORY, new CAsyncClientSocketFactoryImpl());
		m.put(Multiplexer.KEY_PORT_NUMBER, "" + DEFAULT_LISTENING_PORT);
		multiplexer = new Multiplexer(Multiplexer.MPX_MODE_SERVER, m);

		// サーバーソケットチャネルの追加
		multiplexer.addChannel(SelectionKey.OP_ACCEPT);

		System.out.println("サーバーが開始されました[port:" + DEFAULT_LISTENING_PORT + "]");

		boolean loopf = true;

		// 適当なデータをクライアントに送信しつづける
		while(loopf) {
			multiplexer.doWork();
			Thread.sleep(1300);
			sendAll();
		}
	}
	/**
	 * クライアントに対して適当な文字列を送信する
	 * @throws Exception 送信中にエラーが発生した
	 */
	public void sendAll() throws Exception {
		Vector clientChannels = multiplexer.getChannels(); 
		for( int i = 0; i < clientChannels.size(); i++ ) {
			CAsyncSocket casock = (CAsyncSocket)clientChannels.elementAt(i);

			// 送信バッファに対して、送信したいデータを書き込んでおく
			// サーバーソケットが送信可能になった際に、自動的に送信される
			if(casock instanceof CAsyncClientSocket) {
				casock.sendMessage(StringUtils.randomText(16,true).getBytes());
			}
		}
	}
	/**
	 * メインメソッド
	 * @param args プログラム引数
	 * @throws Exception ハンドリングされなかった例外
	 */
	public final static void main(String[] args) throws Exception {
		RandomTextServer rts = new RandomTextServer();
		rts.startServer();
	}
}

// end of RandomTextServer.java
