using System; using System.Collections.Generic; using System.Linq; using System.Text; using Slice; using CommonNetwork_ICE.Common; using CommonServer.Server; using CommonServer_ICE.Session; using CommonServer.Protocol; using CommonLang.Protocol; using CommonNetwork_ICE.Util; using CommonServer_ICE.Server; using CommonLang.Log; namespace CommonServer_ICE.Msg { /// <summary> /// ICE消息委托处理接口 /// </summary> internal abstract class ServerMsgHandler { private static Logger log = LoggerFactory.GetLogger("ServerMsgHandler"); public ServerMsgHandler() { } /// <summary> /// 获取通讯类型 /// </summary> public abstract IceConnectServer getServer(); /// <summary> /// 处理收到客户端发来的关键数据包 /// </summary> /// <param name="recvPort">发送方侦听端口</param> /// <param name="message">数据包</param> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public abstract void RecvData(int recvPort, TransMessage message, string ip, int port); /// <summary> /// 处理收到客户端发来的关键数据包确认序列号 /// </summary> /// <param name="recvPort">发送方侦听端口</param> /// <param name="serial">序列号</param> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public abstract void SendDataRecvAck(int recvPort, long serial, string ip, int port); /// <summary> /// 处理客户端连接到服务器,回发连接响应 /// </summary> /// <param name="recvPort">发送方侦听端口</param> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public void Connect(int recvPort, string ip, int port) { log.Info("收到客户端发来请求连接,地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); if (SessionManager.hasSession(ip, port, recvPort)) { // 已经连接,发送连接成功确认 IceServerIoSession confirmSession = (IceServerIoSession)SessionManager.getSession(ip, port, recvPort); if (!confirmSession.IsConnected) { confirmSession.IsConnected = true; try { confirmSession.Sender.ConnectAck(); } catch (Exception e) { confirmSession.HandleException(e); } } else { log.Error("非法的多次连接,不予处理,客户端地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); } return; } IceConnectServer server = this.getServer(); IceServerIoSession session = SessionManager.createSession(server, ip, port, recvPort); // 初始化Session的ICE发送 IceConnector connector = new IceConnector(Constants.SEND_INTERFACE_NAME, Constants.SERVER_SENDER_RECV_ADAPTER, ip, recvPort, server.getServerConfig().Ip, server.getServerConfig().Port); try { IceInit.InitIceSender(server.getCommType(), connector); } catch (Exception e) { session.HandleException(e); return; } if (connector.SenderConnector == null) { log.Error("初始化服务器端发送器异常,创建Session不成功,客户端地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); return; } session.Connector = connector; session.Sender = connector.Sender; // 启用Session session.IsConnected = true; // 发送连接成功确认 try { server.OnNewSessionConnected(session); session.OnSessionStarted(); session.Sender.ConnectAck(); } catch (Exception e) { session.HandleException(e); } } /// <summary> /// 服务器发送连接成功响应 /// </summary> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public void ConnectAck(string ip, int port) { } /// <summary> /// 处理客户端发出关闭会话请求,服务器 /// </summary> /// <param name="recvPort">发送方侦听端口</param> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public void Close(int recvPort, string ip, int port) { log.Info("收到客户端发来关闭连接请求,地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); IceServerIoSession session = (IceServerIoSession)SessionManager.getSession(ip, port, recvPort); if (session != null) { try { session.Sender.CloseAck(recvPort); } catch (Exception e) { session.HandleException(e); } // 发送关闭确认响应 session.Disconnect(true); } else { log.Error("非法的关闭命令,客户端地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); return; } } /// <summary> /// 处理服务器主动关闭会话,客户端回发关闭连接响应 /// </summary> /// <param name="recvPort">发送方侦听端口</param> /// <param name="ip">发送方IP</param> /// <param name="port">发送方端口</param> public void CloseAck(int recvPort, string ip, int port) { log.Info("收到客户端发来关闭成功响应,地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); IceServerIoSession session; if (SessionManager.hasSession(ip, port, recvPort)) { session = (IceServerIoSession)SessionManager.getSession(ip, port, recvPort); session.Disconnect(true); } else { log.Error("非法的关闭响应命令,客户端地址IP【" + ip + "】,端口【" + port + "】,发送方侦听端口【" + recvPort + "】"); return; } } } }