コード例 #1
0
    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="clientSocket"></param>
    private static void ReceiveMessage(object _data)
    {
        DP_Msg data = (DP_Msg)_data;

        while (!data.m_bError)
        {
            Thread.Sleep(10);

            //lock (data.m_Lock)
            {
                Queue <WfPacket> local_RecvQueue        = data.m_RecvQueue;
                Queue <WfPacket> local_SendQueue        = data.m_SendQueue;
                object           local_Lock             = data.m_Lock;
                PacketHandlerMgr local_PacketHandlerMgr = data.m_PacketHandlerMgr;
                Socket           myClientSocket         = data.clientSocket;
                string           text   = null;
                bool             flag   = false;
                byte[]           array  = new byte[WfPacket.GetHeaderLength()];
                byte[]           array2 = null;
                int num = 0;
                do
                {
                    text = ServerNet.RecvAll(data, ref array, ref array2, ref num, ref flag);
                    if (num != 0)
                    {
                        data.m_LastConnTime = Environment.TickCount;
                    }
                }while (text == null && !flag);
            }
        }
        Log.print("线程{0}ReceiveMessage结束。", data.clientSocket.RemoteEndPoint.ToString());
    }
コード例 #2
0
        public static void ProcessPacket(WfPacket packet)
        {
            ushort msgType   = 0;
            ushort msgLength = 0;

            packet.ReadHeader(ref msgType, ref msgLength);
            if (NetworkManager.GetEnableDebug(NetworkProtol.Tcp))
            {
                Debug.Log("收到:" + Convert.ToString(msgType, 16));
            }
            System.Action <WfPacket> hander = null;
            if (!m_Handlers.TryGetValue(msgType, out hander))
            {
                //Debug.LogWarning("msg not find in battle, will process in hotfix" + Convert.ToString(msgType, 16));
                //PacketHandlerMgrHF_ProcessPacket.SafeInvoke((int)msgType, (int)msgLength, packet);
            }
            else
            {
                try
                {
                    hander(packet);
                }
                catch (Exception ex)
                {
                    Debug.LogException(ex);
                }
            }
        }
コード例 #3
0
        //登录服消息返回
        private void SC_LoginRst(WfPacket packet)
        {
            //获取登录服务器信息
            SC_LoginRst pak = PooledClassManagerHF <SC_LoginRst> .CreateClass();

            pak.DeSerialize(packet);
            int result = pak.m_rst;

            if (result == 0)
            {
                m_Login.m_GameServers.Clear();
                GameServerInfo info = new GameServerInfo();
                info.m_szIp      = m_Login.m_LoginInfo.m_szIp;
                info.m_iPort     = 24000;
                info.m_SessionId = pak.m_sessionid;
                m_Login.m_GameServers.Add(info);
                Debug.Log("获取服务器信息成功:" + info.m_SessionId);

                m_LoginRst = emLoginResult.emLoginResult_OK;
                CGameProcedure.SetProcedureStatus((int)LoginStatus.LoginRst_Ok);

                //连接游戏服务器
                //StartLoginGame();
            }
            else
            {
                m_LoginRst = emLoginResult.emLoginResult_Failed;
                CGameProcedure.SetProcedureStatus((int)LoginStatus.LoginRst_Ok);
                Debug.LogError("登录失败");
            }

            pak.DestroyClass();
        }
コード例 #4
0
    private static string SendAll(DP_Msg data, WfPacket msgSending, ref int nSended)
    {
        SocketError socketError;
        int         num = data.clientSocket.Send(msgSending.GetBytes(), nSended, msgSending.GetOffset() - nSended, SocketFlags.None, out socketError);
        string      result;

        if (num < 0)
        {
            result = "SendData < 0";
        }
        else
        {
            if (socketError != SocketError.Success && socketError != SocketError.WouldBlock)
            {
                result = "SendData Failed";
            }
            else
            {
                nSended += num;
                if (nSended > msgSending.GetOffset())
                {
                    result = "SendData IO error";
                }
                else
                {
                    result = null;
                }
            }
        }
        return(result);
    }
コード例 #5
0
    private string SendAll(WfPacket msgSending, ref int nSended)
    {
        SocketError socketError;
        int         sendNum = m_Socket.Send(msgSending.GetReadBytes(), nSended, msgSending.GetOffset() - nSended, SocketFlags.None, out socketError);
        string      result;

        if (sendNum < 0)
        {
            result = "SendData < 0";
        }
        else
        {
            if (socketError != SocketError.Success && socketError != SocketError.WouldBlock)
            {
                result = "SendData Failed";
            }
            else
            {
                nSended += sendNum;
                if (nSended > msgSending.GetOffset())
                {
                    result = "SendData IO error";
                }
                else
                {
                    result = null;
                }
            }
        }
        //Debug.Log("底层函数发送数据给服务器:"+socketError.ToString());
        return(result);
    }
コード例 #6
0
    public void ProcessPacket(ClientSession socket, WfPacket packet)
    {
        ushort msgType   = 0;
        ushort msgLength = 0;

        packet.ReadHeader(ref msgType, ref msgLength);
        if (ServerNet.GetEnableDebug())
        {
            Debug.Log("receive:" + Convert.ToString(msgType, 16));
        }
        System.Action <ClientSession, WfPacket> packetHandler = (System.Action <ClientSession, WfPacket>)m_KCPPacketHandlers[(ushort)msgType];
        if (packetHandler == null)
        {
            Debug.Log("msg not process=" + msgType.ToString());
        }
        else
        {
            try
            {
                packetHandler(socket, packet);
            }
            catch (Exception ex)
            {
                Debug.LogException(ex);
            }
        }
    }
コード例 #7
0
 public override void DeSerialize(WfPacket r)
 {
     m_ObjId    = r.ReadInt();
     m_SkillId  = r.ReadUInt();
     m_x        = r.ReadInt();
     m_y        = r.ReadInt();
     m_TargetId = r.ReadInt();
 }
コード例 #8
0
 public override void DeSerialize(WfPacket r)
 {
     m_type      = r.ReadInt();
     m_account   = r.ReadString();
     m_pwd       = r.ReadString();
     m_equipment = r.ReadString();
     m_machine   = r.ReadString();
 }
コード例 #9
0
 public override void Serialize(WfPacket w)
 {
     w.Write(m_type);
     w.Write(m_account);
     w.Write(m_pwd);
     w.Write(m_equipment);
     w.Write(m_machine);
 }
コード例 #10
0
 public override void Serialize(WfPacket w)
 {
     w.Write(m_ObjId);
     w.Write(m_SkillId);
     w.Write(m_x);
     w.Write(m_y);
     w.Write(m_TargetId);
 }
コード例 #11
0
    private static void OnClientMsg(ClientSession socket, WfPacket pak)
    {
        int      logicCount = pak.ReadInt();
        WfPacket msg        = new WfPacket(0, 300);

        msg.Write((int)logicCount);
        KCPNet.SendPacket(socket, msg);
        UnityEngine.Debug.Log("Send msg" + logicCount.ToString());
    }
コード例 #12
0
        private void OnPlayerInfo(WfPacket packet)
        {
            SC_PlayerInfo pak = new SC_PlayerInfo();

            pak.DeSerialize(packet);


            LeaveLoginScene();
            CGameProcedure.SetActiveProc(CGameProcedure.s_ProcLobby);
        }
コード例 #13
0
 public static void SendPacket(DP_Msg data, WfPacket msg)
 {
     lock (data.m_Lock)
     {
         if (m_bEnableDebug)
         {
             Log.print("sending:" + msg.m_Command + " to " + data.clientSocket.RemoteEndPoint.ToString());
         }
         data.m_SendQueue.Enqueue(msg);
     }
 }
コード例 #14
0
 public void Update()
 {
     if (!IsNetRun())
     {
         return;
     }
     if (m_ConnectState == EConnectState.Connected)
     {
         if (m_uNextCheckTime < (int)UnityEngine.Time.realtimeSinceStartup)
         {
             m_uNextCheckTime = (uint)UnityEngine.Time.realtimeSinceStartup + 1000u;
             //这里只能检测客户端网络环境,无法反应是否已经掉线。
             if (m_CurNetwork != Application.internetReachability)
             {
                 Shutdown();
                 Debug.Log("internetReachability Network changed");
             }
         }
         object privateLockObject;
         Monitor.Enter(privateLockObject = m_PrivateLockObject);
         try
         {
             while (m_RecvQueue.Count > 0)
             {
                 WfPacket packet = m_RecvQueue.Dequeue();
                 GameDll.PacketHandlerManager.ProcessPacket(packet);
                 packet.DestroyClass();
             }
             //对消息进行一个分帧优化处理
             //int count = m_RecvQueue.Count;
             //if (count >= 10)
             //{
             //    for (int i = 0; i < 10; ++i)
             //    {
             //        //我们只要先收到的10条消息在这帧处理
             //        WfPacket packet = m_RecvQueue.Dequeue();
             //        PacketHandlerMgr.GetInstance().ProcessPacket(packet);
             //    }
             //}
             //else
             //{
             //    for (int i = 0; i < count; ++i)
             //    {
             //        WfPacket packet = m_RecvQueue.Dequeue();
             //        PacketHandlerMgr.GetInstance().ProcessPacket(packet);
             //    }
             //}
         }
         finally
         {
             Monitor.Exit(privateLockObject);
         }
     }
 }
コード例 #15
0
    // 服务器发送给客户端
    /// <summary>
    /// WfPacket:来自服务器的原始包数据
    /// SC_PreBattle:解析包数据的包体
    /// DeSerialize:反序列化操作
    /// 说明:反序列化结束后,就可以像var playerdatas = pak.datas;使用字段了。
    /// </summary>
    /// <param name="obj"></param>
    private void ResPreBattle(WfPacket obj)
    {
        Debug.Log("ResPreBattle");
        SC_PreBattle pak = new SC_PreBattle();

        //演示提示:反序列化到SC_PreBattle类
        pak.DeSerialize(obj);
        var playerdatas = pak.datas;

        m_IsReceived = true;
    }
コード例 #16
0
    private static void OnClientMsg(DP_Msg socket, WfPacket pak)
    {
        Packet_StopMove msg = new Packet_StopMove();

        msg.DeSerialize(pak);
        int objId = msg.m_ObjId;

        UnityEngine.Debug.Log("收到客户端消息,ObjId:" + objId);

        SendMsg(socket);
    }
コード例 #17
0
    public override void DeSerialize(WfPacket r)
    {
        int _TempSize = 0;

        _TempSize = r.ReadInt();
        for (int i = 0; i < _TempSize; ++i)
        {
            var _var = new t_PreparePlayerData();
            _var.DeSerialize(r);
            datas.Add(_var);
        }
    }
コード例 #18
0
    public override void Serialize(WfPacket w)
    {
        int _TempSize = 0;

        _TempSize = datas.Count;
        w.Write(_TempSize);
        for (int i = 0; i < _TempSize; ++i)
        {
            var _var = datas[i];
            _var.Serialize(w);
        }
    }
コード例 #19
0
 public static void SendPacket(NetworkProtol np, WfPacket pak)
 {
     pak.Swap();
     if (np == NetworkProtol.Tcp)
     {
         m_TcpNet.SendPacket(pak);
     }
     else if (np == NetworkProtol.Kcp)
     {
         //m_KcpNet.SendPacket(pak);
     }
 }
コード例 #20
0
    public void SendPacket(WfPacket msg)
    {
        object privateLockObject;

        Monitor.Enter(privateLockObject = m_PrivateLockObject);
        try
        {
            m_SendQueue.Enqueue(msg);
        }
        finally
        {
            Monitor.Exit(privateLockObject);
        }
    }
コード例 #21
0
 public static void ProcessPacket(int msgType, int msgLength, WfPacket packet)
 {
     //此时包内已经处理了ReadHeader
     if (m_Handlers.ContainsKey(msgType))
     {
         try
         {
             m_Handlers[msgType](packet);
         }
         catch (Exception ex)
         {
             Debug.LogException(ex);
         }
     }
 }
コード例 #22
0
    public static void SendPacket(NetworkProtol np, ISerializePacket msg, ushort msgType)
    {
        WfPacket pak = PooledClassManager <WfPacket> .CreateClass();

        pak.InitWrite(msgType);
        msg.Serialize(pak);
        pak.Swap();
        if (np == NetworkProtol.Tcp)
        {
            SendPacket(np, pak);
        }
        else if (np == NetworkProtol.Kcp)
        {
            //WfPacket pak = new WfPacket(msgType, 548);
            SendPacket(np, pak);
        }
    }
コード例 #23
0
    public static bool ParseHeader(byte[] packetHeader, ref ushort msgType, ref ushort msgLength)
    {
        bool result;

        if (packetHeader.Length < WfPacket.GetHeaderLength())
        {
            result = false;
        }
        else
        {
            msgLength = BitConverter.ToUInt16(packetHeader, 0);
            msgType   = BitConverter.ToUInt16(packetHeader, 2);
            uint server_use = BitConverter.ToUInt32(packetHeader, 4);
            result = true;
        }
        return(result);
    }
コード例 #24
0
    //自己给自己发消息,用于测试
    public static void SendPacketToMe(NetworkProtol np, ISerializePacket msg, ushort msgType)
    {
        WfPacket pak = PooledClassManager <WfPacket> .CreateClass();

        pak.InitWrite(msgType);
        msg.Serialize(pak);
        pak.Swap();
        if (np == NetworkProtol.Tcp)
        {
            GameDll.PacketHandlerManager.ProcessPacket(pak);
        }
        else if (np == NetworkProtol.Kcp)
        {
            //KCPPacketHandlerMgr.GetInstance().ProcessPacket(pak);
        }
        pak.DestroyClass();
        pak = null;
    }
コード例 #25
0
    private static void SendMessage(object _data)
    {
        DP_Msg data = (DP_Msg)_data;

        while (!data.m_bError)
        {
            Thread.Sleep(10);

            // lock (data.m_Lock)
            {
                Queue <WfPacket> local_RecvQueue        = data.m_RecvQueue;
                Queue <WfPacket> local_SendQueue        = data.m_SendQueue;
                object           local_Lock             = data.m_Lock;
                PacketHandlerMgr local_PacketHandlerMgr = data.m_PacketHandlerMgr;
                Socket           myClientSocket         = data.clientSocket;

                WfPacket msgPacket = null;
                string   text      = null;
                //处理发送消息

                while (local_SendQueue.Count > 0 || msgPacket != null)
                {
                    int num2 = 0;
                    if (msgPacket != null)
                    {
                        text = SendAll(data, msgPacket, ref num2);
                        if (num2 == msgPacket.GetOffset())
                        {
                            msgPacket = null;
                        }
                    }
                    if (text != null || msgPacket != null || local_SendQueue.Count <= 0)
                    {
                        break;
                    }
                    num2      = 0;
                    msgPacket = local_SendQueue.Dequeue();
                    msgPacket.SetHeadLength();
                }
            }
        }
        Log.print("线程{0}SendMessage结束。", data.clientSocket.RemoteEndPoint.ToString());
    }
コード例 #26
0
ファイル: KCPNet.cs プロジェクト: xaerowl/WfBinaryProtocol
    static void server_RecvData(ClientSession session, byte[] data, int offset, int size)
    {
        //byte cmd = data[offset];
        //offset++;
        //收到马上转发
        //string s = System.Text.Encoding.UTF8.GetString(data, offset + 4, size - 4);
        //Console.WriteLine("Recv From:" + session.NetIndex.ToString() + " " + session.EndPoint.ToString() + " data:" + s);
        //session.Send(s);
        UnityEngine.Debug.Log("server_RecvData");
        //读4个字节的Key校验
        uint key    = BitConverter.ToUInt32(data, offset);
        int  length = data.Length - offset - 4;

        byte[] msg = new byte[length];
        Array.Copy(data, offset + 4, msg, 0, length);
        WfPacket item = new WfPacket(msg);

        //向逻辑层抛
        KCPPacketHandlerMgr.GetInstance().ProcessPacket(session, item);
    }
コード例 #27
0
    public override void DeSerialize(WfPacket r)
    {
        m_ObjId = r.ReadInt();
        m_curx  = r.ReadInt();
        m_curz  = r.ReadInt();
        int _TempSize = 0;

        _TempSize = r.ReadInt();
        for (int i = 0; i < _TempSize; ++i)
        {
            int _var = r.ReadInt();
            m_xlist.Add(_var);
        }

        _TempSize = r.ReadInt();
        for (int i = 0; i < _TempSize; ++i)
        {
            int _var = r.ReadInt();
            m_zlist.Add(_var);
        }
    }
コード例 #28
0
    public static void SendMsg(DP_Msg socket)
    {
        SC_PreBattle sendPak = new SC_PreBattle();

        sendPak.datas = new List <t_PreparePlayerData>();

        for (uint i = 0; i < 3; ++i)
        {
            t_PreparePlayerData data = new t_PreparePlayerData();
            data.m_jobid    = i;
            data.m_playerid = i;
            data.m_name     = "Player" + i;

            sendPak.datas.Add(data);
        }
        WfPacket sendPak2 = new WfPacket((ushort)emPacket_Battle.em_SC_PreBattle);

        sendPak.Serialize(sendPak2);
        ServerNet.SendPacket(socket, sendPak2);
        UnityEngine.Debug.Log("向客户端发送消息,SC_PreBattle");
    }
コード例 #29
0
    private static void ProecssMessage(object _data)
    {
        DP_Msg data = (DP_Msg)_data;

        Log.print("ProecssMessage>>>>>>Start");
        while (!data.m_bError)
        {
            Thread.Sleep(10);
            //lock (data.m_Lock)
            {
                Queue <WfPacket> local_RecvQueue        = data.m_RecvQueue;
                Queue <WfPacket> local_SendQueue        = data.m_SendQueue;
                object           local_Lock             = data.m_Lock;
                PacketHandlerMgr local_PacketHandlerMgr = data.m_PacketHandlerMgr;
                Socket           myClientSocket         = data.clientSocket;
                //Log.print("ProecssMessage>>>>>>" + local_RecvQueue.Count.ToString());
                try
                {
                    //通过clientSocket接收数据
                    //lock (local_Lock)
                    {
                        while (local_RecvQueue.Count > 0)
                        {
                            WfPacket packet = local_RecvQueue.Dequeue();
                            local_PacketHandlerMgr.ProcessPacket(data, packet);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.print(ex.Message);
                    myClientSocket.Shutdown(SocketShutdown.Both);
                    myClientSocket.Close();
                    break;
                }
            }
        }
        Log.print("线程{0}ProecssMessage结束。", data.clientSocket.RemoteEndPoint.ToString());
    }
コード例 #30
0
    public void ProcessPacket(DP_Msg socket, WfPacket packet)
    {
        ushort msgType   = 0;
        ushort msgLength = 0;

        packet.ReadHeader(ref msgType, ref msgLength);
        if (ServerNet.GetEnableDebug())
        {
            Debug.Log("receiving:" + msgType);
        }
        System.Action <DP_Msg, WfPacket> handler = null;
        if (!m_PacketHandlers.TryGetValue(msgType, out handler))
        {
            try
            {
                handler(socket, packet);
            }
            catch (Exception ex)
            {
                Log.print(ex.Message);
            }
        }
    }