/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: CAsyncClientSocket.java,v 1.3 2005/05/04 07:49:56 rampil Exp $
 */
package org.logical_paradox.common.net.async;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SocketChannel;

/**
 * CAsyncClientSocket
 * 並行入出力が可能なnon-blockingタイプのソケット
 * ソケットのような動作もするが，実はソケットではない．
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public abstract class CAsyncClientSocket extends CAsyncSocket {
	/** 接続先のサーバー(IPアドレスまたはホスト名) */
	private final String remoteHost;
	/** ポート番号 */
	private int port;
	/** イベントハンドラ */
	private AsyncEventListener listener = null;

	/**
	 * コンストラクタ
	 * 既にオープンされたソケットチャンネルが存在する場合に使用する
	 * @param ch ソケットチャンネル
	 */
	public CAsyncClientSocket(SocketChannel ch) throws IOException {
		remoteHost = "";
		channel = (SelectableChannel)ch;
	}
	/**
	 * コンストラクタ
	 * インスタンス生成時に指定ホストに接続を試行する
	 * @param server リモートホスト名(またはIPアドレス)
	 * @param port ポート番号
	 * @throws IOException サーバーへの接続に失敗した
	 */
	public CAsyncClientSocket(String server, int p) throws IOException {
		remoteHost = server;
		port = p;
		channel = (SelectableChannel)SocketChannel.open(new InetSocketAddress(remoteHost, port));
	}
	/**
	 * このクライアントからサーバーに接続した際に呼び出されるイベントハンドラ
	 * サブクラスで実装する
	 * @param e イベントオブジェクト
	 */
	public abstract void onConnect(AsyncEvent e);
	/**
	 * ソケットが読み込み可能状態になった際に呼び出されるイベントハンドラ
	 * サブクラスではこのメソッドをオーバーライドして実装すること
	 * @param e イベントオブジェクト
	 */
	public abstract void onReceive(AsyncEvent e);

	/**
	 * このクライアントが送信可能状態になった際に呼び出されるイベントハンドラ
	 * 通常このメソッドはオーバーライドする必要はない
	 * @param e イベントオブジェクト
	 */
	public void onSend(AsyncEvent e) {
		super.onSend(e);
	}
	/**
	 * サーバーへの接続が確立した際に呼ばれるイベントハンドラ
	 * このハンドラはクライアントソケットには必要ない
	 * @param e イベントオブジェクト
	 */
	public void onAccept(AsyncEvent e) {
	}
}

// end of CAsyncClientSocket.java
