using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using CommonNetwork_ICE.Common;
using Slice;
using CommonNetwork_ICE.Util;
using CommonNetwork_ICE.handler;
using CommonLang.Protocol;
using CommonNetwork_ICE.Msg;
using CommonNetwork_ICE.Session;
using CommonLang.Log;
using CommonLang.Concurrent;
namespace CommonNetwork_ICE.Client
{
///
/// ICE客户端连接器,指定解码器,初始化本对象后可向指定服务器发送ICE消息,接收消息请先绑定会话侦听对象
///
public abstract class IceClientConnector
{
private static Logger log = LoggerFactory.GetLogger("IceClientConnector");
// 数据包编码解码器
internal IceMessageCodec codec;
// ICE接收消息委托处理类
internal SenderDisp_ clientSendHandler;
// 消息队列
internal ClientMessageQueue messageQueue;
// 会话对象
internal IceClientNetSession session;
// 会话消息序列号编号器
private AtomicInteger msgSerialGenerator;
public IceClientConnector(IceClientNetSession session)
: this(session, Env.ICE_SEND_REMOTE_IP.Clone().ToString(), Env.ICE_SEND_REMOTE_PORT)
{
}
public IceClientConnector(IceClientNetSession session, String ip, int port)
{
String localIp = "127.0.0.1";
int localPort = 0;
IceConnector netConnector = new IceConnector(
Constants.SEND_INTERFACE_NAME,
Constants.SERVER_SENDER_RECV_ADAPTER,
ip, port,
localIp,
localPort);
this.Connector = netConnector;
this.session = session;
msgSerialGenerator = new AtomicInteger(1);
RecvLastSerial = -1;
}
internal abstract SenderDisp_ getClientSendHandler(IceClientNetSession session, IceMessageCodec Codec);
// ICE连接器
internal IceConnector Connector { get; set; }
// 是否已经连接上服务器
public bool IsConnected { internal set; get; }
// 客户端收到服务器发来的最后一条关键数据包序号
internal long RecvLastSerial { set; get; }
///
/// 初始化ICE接收和发送端
///
public abstract void Open(int localListenPort);
///
/// 设定本地监听端口
///
/// 初始监听端口
protected void setLocalPort(int localListenPort)
{
int port = NetUtil.GetUsablePort(localListenPort);
if (port == -1)
{
Env.ENV_ERR_CODE = Error.ERR_CODE_3;
throw new Exception("没有找到可用端口, 基准端口:" + this.Connector.GetConnectorConfig().LocalPort);
}
this.Connector.GetConnectorConfig().LocalPort = port;
}
internal void ConnectToSever(int commType)
{
// 客户端接收数据处理器
clientSendHandler = getClientSendHandler(session, codec);
try
{
bool initServerSuccessed = Connector.InitRecvServer(commType, clientSendHandler);
if (!initServerSuccessed)
{
throw new Exception("初始化服务器失败!");
}
Connector.InitSender(commType);
Connector.Sender.Connect(this.Connector.GetConnectorConfig().LocalPort);
}
catch (Exception e)
{
log.Error("连接远程服务器IP【" + this.Connector.GetConnectorConfig().RemoteIp + "】和端口【" + this.Connector.GetConnectorConfig().RemotePort + "】异常:" + e.Message);
throw e;
}
log.Log("正在连接服务器,请等待" + Env.CLIENT_CONNECT_WAIT_TIME / 100 + "秒。");
int i = 0;
while (i <= Env.CLIENT_CONNECT_WAIT_TIME)
{
if (IsConnected)
{
break;
}
try
{
Thread.Sleep(10);
}
catch (Exception e) { }
i++;
}
if (IsConnected)
{
log.Info("已经连接上服务器IP【" + this.Connector.GetConnectorConfig().RemoteIp + "】和端口【" + this.Connector.GetConnectorConfig().RemotePort + "】,可以正常发送数据。");
}
else
{
throw new Exception("不能连接服务器,请检查远程IP【" + this.Connector.GetConnectorConfig().RemoteIp + "】和端口【" + this.Connector.GetConnectorConfig().RemotePort + "】。");
}
}
///
/// 关闭通讯通道
///
public abstract void Close();
///
/// 关闭ICE网络资源
///
internal void CloseConnect()
{
if (Connector != null)
{
if (Connector.Sender != null)
{
bool error = false;
try
{
Connector.Sender.Close(this.Connector.GetConnectorConfig().LocalPort);
}
catch (Exception e)
{
error = true;
log.Error("关闭客户端出错:" + e.Message);
}
if (!error)
{
log.Log("正在关闭客户端,请等待" + Env.CLIENT_CONNECT_WAIT_TIME / 100 + "秒。");
int i = 0;
while (i <= Env.CLIENT_CONNECT_WAIT_TIME)
{
if (!IsConnected)
{
break;
}
try
{
Thread.Sleep(10);
}
catch (Exception e) { }
i++;
}
if (IsConnected)
{
log.Error("关闭客户端超时,强行终止。");
IsConnected = false;
}
else
{
log.Log("关闭客户端成功。");
}
}
}
Connector.Destroy();
Connector = null;
}
}
///
/// 设定解码器
///
///
public void SetMessageCodec(IceMessageCodec codec)
{
this.codec = codec;
}
///
/// 发送消息
///
/// 消息对象
public bool SendMessage(IMessage message)
{
if (!IsConnected)
{
log.Error("没有连接上服务器,不能发送数据。");
session.onException(new Exception("没有连接上服务器,不能发送数据。"));
return false;
}
if (this.codec == null)
{
log.Error("没有绑定解码器,不能发送数据。");
session.onException(new Exception("没有绑定解码器,不能发送数据。"));
return false;
}
TransMessage transMessage = null;
try
{
this.codec.doEncode(message, out transMessage);
}
catch (Exception e)
{
String msg = "消息解码异常:" + message.GetType() + "" + e.Message;
log.Error(msg);
session.onException(e);
return false;
}
transMessage.serial = msgSerialGenerator.GetAndIncrement();
if (transMessage != null)
{
bool successed = SendTo(transMessage);
if (!successed)
{
return false;
}
}
session.onSent(message, transMessage.length);
return true;
}
///
/// 具体的发送方法
///
///
internal abstract bool SendTo(TransMessage transMessage);
// 设定服务器收到已发送数据包序列号
internal void SetSentLastSerial(long serial)
{
if (messageQueue != null)
{
messageQueue.LastSerial = serial;
}
}
}
}