示例#1
0
        /// <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;
            //});
        }
示例#2
0
        public GameServerClient getClient(Socket socket)
        {
            GameServerClient client = null;

            gameServerClients.TryGetValue(socket, out client);
            return(client);
        }
示例#3
0
        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;
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
        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);
                }
            }
        }
示例#7
0
        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);
        }
示例#8
0
        /// <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);
 }