using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonNetwork_ICE.Common;
using CommonLang.Protocol;
using CommonNetwork_ICE.Util;
using CommonNetwork_ICE.Session;
using Slice;
using CommonLang.Log;
using CommonNetwork_ICE.Client;
namespace CommonNetwork_ICE.Msg
{
///
/// ICE消息委托处理类:根据客户端消息接收类的委托,处理服务器发来的ICE网络消息
///
internal class ClientMsgHandlerUdpDelegate : ClientMsgHandler
{
private static Logger log = LoggerFactory.GetLogger("ClientMsgHandlerUdpDelegate");
public ClientMsgHandlerUdpDelegate(IceClientConnector iceClient, IceClientNetSession session)
: base(iceClient, session)
{
}
///
/// 收到数据包
///
/// 数据包
/// 发送方IP
/// 发送方端口
public override void RecvData(int recvPort, TransMessage message, String ip, int port)
{
log.Trace("收到服务器发来数据,地址IP【" + ip + "】,端口【" + port + "】,编号:" + message.serial);
//session.TotalRecvBytes += message.length;
if (message.type == Constants.PACKET_HINGE && message.serial == iceClient.RecvLastSerial)
{
// 如果是之前已经收到的关键响应数据包,只发送响应确认
try
{
iceClient.Connector.Sender.SendAck(recvPort, message.serial);
}
catch (Exception e)
{
log.Error(e.Message);
session.onException(e);
}
return;
}
// 关键数据包发送响应
if (message.type == Constants.PACKET_HINGE)
{
bool repeatMsg = true;
if (message.serial > iceClient.RecvLastSerial)
{
iceClient.RecvLastSerial = message.serial;
repeatMsg = false;
}
// 发送响应确认
try
{
iceClient.Connector.Sender.SendAck(recvPort, message.serial);
}
catch (Exception e)
{
log.Error(e.Message);
session.onException(e);
}
// 重发的消息不处理
if (repeatMsg)
{
return;
}
}
// 数据解码
IMessage imessage = null;
try
{
Codec.doDecode(message, out imessage);
}
catch (Exception e)
{
Env.ENV_ERR_CODE = Error.ERR_CODE_4;
session.onException(e);
return;
}
if (imessage == null)
{
return;
}
// 数据处理
try
{
long startTickCount = Environment.TickCount;
session.onReceive(imessage, message.length);
long endTickCount = Environment.TickCount;
long interval = endTickCount - startTickCount;
if (interval > Env.MSG_PROC_TIME_OUT)
{
log.Info("客户端消息处理超时,用时【" + interval + "】,消息编号【" + imessage.GetType() + "】,接收端口【" + recvPort + "】");
}
}
catch (Exception e)
{
log.Error(e.Message);
Env.ENV_ERR_CODE = Error.ERR_CODE_5;
session.onException(e);
}
}
}
}