/// <summary> /// 断开成功通知函数 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SocketClosed(object sender, SocketAsyncEventArgs e) { SocketListener sl = sender as SocketListener; Socket s = (e.UserToken as AsyncUserToken).CurrentSocket; //将接收的缓冲删除 lock (dictInPackets) { if (dictInPackets.ContainsKey(s)) { TCPInPacket tcpInPacket = dictInPackets[s]; tcpInPacketPool.Push(tcpInPacket); //缓冲回收 dictInPackets.Remove(s); } } //断开连接时,清除会话实例 lock (gameServerClients) { GameServerClient client = null; if (gameServerClients.TryGetValue(s, out client)) { client.release(); gameServerClients.Remove(s); } } //通知主窗口显示连接数 //RootWindow.Dispatcher.BeginInvoke((MethodInvoker)delegate //{ RootWindow.TotalConnections = sl.ConnectedSocketsCount; //}); }
public GameServerClient getClient(Socket socket) { GameServerClient client = null; gameServerClients.TryGetValue(socket, out client); return(client); }
private void SocketClosed(object sender, SocketAsyncEventArgs e) { SocketListener sl = sender as SocketListener; Socket s = (e.UserToken as AsyncUserToken).CurrentSocket; lock (this.dictInPackets) { if (this.dictInPackets.ContainsKey(s)) { TCPInPacket tcpInPacket = this.dictInPackets[s]; this.tcpInPacketPool.Push(tcpInPacket); this.dictInPackets.Remove(s); } } lock (this.gameServerClients) { GameServerClient client = null; if (this.gameServerClients.TryGetValue(s, out client)) { client.release(); this.gameServerClients.Remove(s); } } this.RootWindow.TotalConnections = sl.ConnectedSocketsCount; }
public TCPProcessCmdResults dispathProcessor(GameServerClient client, int nID, byte[] data, int count) { //tring cmdData = null; // try // { // cmdData = new UTF8Encoding().GetString(data, 0, count); // } // catch (Exception) //解析错误 // { // LogManager.WriteLog(LogTypes.Error, string.Format("解析指令字符串错误, CMD={0}, Client={1}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(client.CurrentSocket))); // return TCPProcessCmdResults.RESULT_FAILED; // } try { // //获取指令参数数量 // short cmdParamNum = -1; // if (!cmdParamNumMapping.TryGetValue(nID, out cmdParamNum)) // { // LogManager.WriteLog(LogTypes.Error, string.Format("未注册指令, CMD={0}, Client={1}", // (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(client.CurrentSocket))); // return TCPProcessCmdResults.RESULT_FAILED; // }; //解析用户名称和用户密码 // string[] cmdParams = cmdData.Split(':'); // if (cmdParams.Length != cmdParamNum) // { // LogManager.WriteLog(LogTypes.Error, string.Format("指令参数个数错误, CMD={0}, Client={1}, Recv={2}", // (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(client.CurrentSocket), cmdParams.Length)); // return TCPProcessCmdResults.RESULT_FAILED; // } //获取相对应的指令处理器 ICmdProcessor cmdProcessor = null; if (!cmdProcesserMapping.TryGetValue(nID, out cmdProcessor)) { LogManager.WriteLog(LogTypes.Error, string.Format("未注册指令, CMD={0}, Client={1}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(client.CurrentSocket))); client.sendCmd((int)TCPGameServerCmds.CMD_DB_ERR_RETURN, "0"); return(TCPProcessCmdResults.RESULT_DATA); } cmdProcessor.processCmd(client, data, count); return(TCPProcessCmdResults.RESULT_OK); } catch (Exception ex) { // 格式化异常错误信息 DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.CurrentSocket), false); } client.sendCmd((int)TCPGameServerCmds.CMD_DB_ERR_RETURN, "0"); return(TCPProcessCmdResults.RESULT_DATA); }
/// <summary> /// 命令包接收完毕后的回调事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private bool TCPCmdPacketEvent(object sender) { TCPInPacket tcpInPacket = sender as TCPInPacket; //接收到了完整的命令包 TCPOutPacket tcpOutPacket = null; TCPProcessCmdResults result = TCPProcessCmdResults.RESULT_FAILED; GameServerClient client = null; if (!gameServerClients.TryGetValue(tcpInPacket.CurrentSocket, out client)) { LogManager.WriteLog(LogTypes.Error, string.Format("未建立会话或会话已关闭: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket))); return(false); } //接收到了完整的命令包 long processBeginTime = TimeUtil.NowEx(); result = TCPCmdHandler.ProcessCmd(client, DBMgr, tcpOutPacketPool, tcpInPacket.PacketCmdID, tcpInPacket.GetPacketBytes(), tcpInPacket.PacketDataSize, out tcpOutPacket); long processTime = (TimeUtil.NowEx() - processBeginTime); if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket) { //向对方发送数据 socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket); } else if (result == TCPProcessCmdResults.RESULT_FAILED)//解析失败, 直接关闭连接 { LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket))); //socketListener.CloseSocket(tcpInPacket.CurrentSocket); return(false); } lock (cmdMoniter) //锁定命令监控对象 { int cmdID = tcpInPacket.PacketCmdID; PorcessCmdMoniter moniter = null; if (!cmdMoniter.TryGetValue(cmdID, out moniter)) { moniter = new PorcessCmdMoniter(cmdID, processTime); cmdMoniter.Add(cmdID, moniter); } moniter.onProcessNoWait(processTime); } return(true); }
private void SocketConnected(object sender, SocketAsyncEventArgs e) { SocketListener sl = sender as SocketListener; this.RootWindow.TotalConnections = sl.ConnectedSocketsCount; lock (this.gameServerClients) { GameServerClient client = null; Socket s = (e.UserToken as AsyncUserToken).CurrentSocket; if (!this.gameServerClients.TryGetValue(s, out client)) { client = new GameServerClient(s); this.gameServerClients.Add(s, client); } } }
private bool TCPCmdPacketEvent(object sender) { TCPInPacket tcpInPacket = sender as TCPInPacket; TCPOutPacket tcpOutPacket = null; GameServerClient client = null; bool result2; if (!this.gameServerClients.TryGetValue(tcpInPacket.CurrentSocket, out client)) { LogManager.WriteLog(LogTypes.Error, string.Format("未建立会话或会话已关闭: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)), null, true); result2 = false; } else { TCPManager.CurrentClient = client; long processBeginTime = TimeUtil.NowEx(); TCPProcessCmdResults result = TCPCmdHandler.ProcessCmd(client, this.DBMgr, this.tcpOutPacketPool, (int)tcpInPacket.PacketCmdID, tcpInPacket.GetPacketBytes(), tcpInPacket.PacketDataSize, out tcpOutPacket); long processTime = TimeUtil.NowEx() - processBeginTime; if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket) { this.socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket); } else if (result == TCPProcessCmdResults.RESULT_FAILED) { LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)), null, true); return(false); } lock (TCPManager.cmdMoniter) { int cmdID = (int)tcpInPacket.PacketCmdID; PorcessCmdMoniter moniter = null; if (!TCPManager.cmdMoniter.TryGetValue(cmdID, out moniter)) { moniter = new PorcessCmdMoniter(cmdID, processTime); TCPManager.cmdMoniter.Add(cmdID, moniter); } moniter.onProcessNoWait(processTime); } TCPManager.CurrentClient = null; result2 = true; } return(result2); }
/// <summary> /// 连接成功通知函数 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SocketConnected(object sender, SocketAsyncEventArgs e) { SocketListener sl = sender as SocketListener; //RootWindow.Dispatcher.BeginInvoke((MethodInvoker)delegate //{ RootWindow.TotalConnections = sl.ConnectedSocketsCount; //}); //第一次建立连接时创建会话实例 lock (gameServerClients) { GameServerClient client = null; Socket s = (e.UserToken as AsyncUserToken).CurrentSocket; if (!gameServerClients.TryGetValue(s, out client)) { client = new GameServerClient(s); gameServerClients.Add(s, client); } } }
public TCPProcessCmdResults dispathProcessor(GameServerClient client, int nID, byte[] data, int count) { try { ICmdProcessor cmdProcessor = null; if (!this.cmdProcesserMapping.TryGetValue(nID, out cmdProcessor)) { LogManager.WriteLog(LogTypes.Error, string.Format("未注册指令, CMD={0}, Client={1}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(client.CurrentSocket)), null, true); client.sendCmd(30767, "0"); return(TCPProcessCmdResults.RESULT_DATA); } cmdProcessor.processCmd(client, nID, data, count); return(TCPProcessCmdResults.RESULT_OK); } catch (Exception ex) { DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.CurrentSocket), false, false); } client.sendCmd(30767, "0"); return(TCPProcessCmdResults.RESULT_DATA); }