/*
 * $Id: RandomTextClient.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;


/**
 * RandomTextClient
 * サーバーからランダムな文字列を並行して受信しつづけるクライアントプログラム
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public final class RandomTextClient {
	private int maxClients = 5;								// クライアント数
	private final String rts;									// サーバー
	private final Multiplexer multiplexer;					// マルチプレクサ

	/**
	 * コンストラクタ
	 * @param server リモートホスト
	 * @throws Exception 初期化に失敗した際に発生する例外
	 */
	public RandomTextClient(String server) throws Exception {
		// クライアントモードでマルチプレクサを生成する
		HashMap m = new HashMap();
		m.put(Multiplexer.KEY_CLIENT_SOCKET_FACTORY, new CAsyncClientSocketFactoryImpl());
		m.put(Multiplexer.KEY_PORT_NUMBER, "" + RandomTextServer.DEFAULT_LISTENING_PORT);
		m.put(Multiplexer.KEY_REMOTE_HOST, server);
		rts = server;
		multiplexer = new Multiplexer(Multiplexer.MPX_MODE_CLIENT, m);

		// ソケットチャンネルを初期化する
		for(int i = 0; i < maxClients; i++) {
			multiplexer.addChannel(SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE);
		}
	}

	/**
	 * サーバーに対して適当な文字列を送信しつづける
	 * @throws Exception データ送信中に発生した例外
	 */
	public void doWork() throws Exception {
		boolean loopf = true;

		while(loopf) {
			multiplexer.doWork();
			Thread.sleep(500);
			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 static final void main(String[] args) throws Exception {
		if(args.length != 1) {
			System.err.println("usage: java org.logical_paradox.rts.client.RandomTextClient <hostname>");
			return;
		}

		final RandomTextClient rtc = new RandomTextClient(args[0]);
		rtc.doWork();
	}
}

// end of RandomTextClient.java
