package ALBasicClient;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
import ALBasicCommon._AALBasicThread;
import ALServerLog.ALServerLog;
import BasicServer.C2S_BasicClientVerifyInfo;
public class ALBasicClientRecThread extends _AALBasicThread
{
/** 客户端对象类型 */
private int _m_iClientType;
/** 登录验证信息 */
private String _m_sUserName;
private String _m_sUserPassword;
/** 登录时发送的自定义信息 */
private String _m_sCustomMsg;
/** 线程是否退出 */
private boolean _m_bThreadExit;
private ALBasicClientSocket _m_scSocket;
private SocketChannel _m_SocketChannel;
private String _m_sServerIP;
private int _m_iServerPort;
public ALBasicClientRecThread(int _clientType, String _userName, String _userPassword, String _customMsg, ALBasicClientSocket _socket, String _serverIP, int _serverPort)
{
_m_iClientType = _clientType;
_m_sUserName = _userName;
_m_sUserPassword = _userPassword;
_m_sCustomMsg = _customMsg;
_m_bThreadExit = false;
_m_scSocket = _socket;
_m_sServerIP = _serverIP;
_m_iServerPort = _serverPort;
_m_SocketChannel = null;
}
public void ExitThread()
{
_m_bThreadExit = true;
}
/******************
* 线程执行函数
*
* @author alzq.z
* @time Feb 20, 2013 11:03:08 PM
*/
@Override
protected void _run()
{
Selector clientSelector = null;
try
{
clientSelector = Selector.open();
_m_SocketChannel = _m_scSocket._getSocketChannel();
InetSocketAddress address = new InetSocketAddress(_m_sServerIP, _m_iServerPort);
if(!_m_SocketChannel.connect(address))
{
_m_scSocket._logout();
return ;
}
_m_SocketChannel.configureBlocking(false);
_m_SocketChannel.register(clientSelector, SelectionKey.OP_READ);
//发送登录请求
C2S_BasicClientVerifyInfo msg = new C2S_BasicClientVerifyInfo();
msg.setClientType(_m_iClientType);
msg.setUserName(_m_sUserName);
msg.setUserPassword(_m_sUserPassword);
if(null == _m_sCustomMsg)
msg.setCustomMsg("");
else
msg.setCustomMsg(_m_sCustomMsg);
_m_scSocket.send(msg.makePackage());
}
catch (Exception ex)
{
_m_scSocket._logout();
return ;
}
//创建接收BUF
ByteBuffer recBuffer = ByteBuffer.allocate(ALBasicClientConf.getInstance().getRecBufferLen() * 2);
//开启循环处理Socket事件
while(!_m_bThreadExit)
{
try
{
clientSelector.select();
} catch (Exception e) {
ALServerLog.Fatal("Client port select event error!!");
e.printStackTrace();
}
//循环获取到的事件
Set<SelectionKey> readyKeySet = clientSelector.selectedKeys();
Iterator<SelectionKey> iter = readyKeySet.iterator();
while(iter.hasNext())
{
SelectionKey key = (SelectionKey)iter.next();
//移除已经取出的事件
iter.remove();
if(key.isReadable())
{
//收到数据
SocketChannel socketChannel = (SocketChannel)key.channel();
//读取数据
try
{
recBuffer.clear();
//此时进行读取,当读取的包大小超过存储区域则可能导致数据读取不全
int recLen = socketChannel.read(recBuffer);
//设置限制,并将读取位置归0
recBuffer.flip();
if(recLen < 0)
{
_m_scSocket._logout();
return ;
}
if(recLen > 0)
{
//处理消息读取
_m_scSocket._socketReceivingMessage(recBuffer);
}
}
catch (IOException e)
{
_m_scSocket._logout();
return ;
}
catch (Exception e)
{
ALServerLog.Fatal("Client port read buffer error!!");
e.printStackTrace();
}
}
}
}
}
}