Esempio n. 1
0
 void socketRecv()
 {
     if (m_socket.Connected && m_isReady)
     {
         byte[] data = new byte[1024]; // 以1024字节为单位接收数据
         m_socket.BeginReceive(data, 0, data.Length, SocketFlags.None, result =>
         {
             try
             {
                 int length   = m_socket.EndReceive(result);
                 m_totalRecv += length;
                 // 解码并执行回调
                 if (length > 0)
                 {
                     string str = Encoding.UTF8.GetString(data);
                     onRecvMsg(str, length);
                     socketRecv();
                 }
                 else
                 {
                     throw new Exception("Socket recv 0 byte");
                 }
             }
             catch (Exception e)
             {
                 uninit();
                 SFUtils.logWarning("网络连接中断:" + e.Message);
                 dispatcher.dispatchEvent(SFEvent.EVENT_NETWORK_INTERRUPTED);
             }
         }, null);
     }
 }
Esempio n. 2
0
 public void init()
 {
     SFUtils.log("正在连接GameServer...");
     m_sendQueue      = new Queue <SFBaseRequestMessage>();
     m_recvQueue      = new Queue <string>();
     dispatcher       = new SFEventDispatcher(this);
     m_client         = new SFTcpClient();
     m_ping           = -1;
     m_heartbeatTimer = SFCommonConf.instance.heatbeatInterval;
     m_client.init(SFCommonConf.instance.serverIp, SFCommonConf.instance.serverPort, onRecvMsg, ret =>
     {
         if (ret == 0)
         {
             SFUtils.log("连接GameServer成功");
         }
         else
         {
             SFUtils.logWarning("连接GameServer失败");
         }
         dispatcher.dispatchEvent(SFEvent.EVENT_NETWORK_READY, new SFSimpleEventData(ret));
     });
     m_client.dispatcher.addEventListener(this, SFEvent.EVENT_NETWORK_INTERRUPTED, e =>
     {
         dispatcher.dispatchEvent(e);
     });
     dispatcher.addEventListener(this, SFResponseMsgSocketHeartbeat.pName, onHeartbeat);
 }
Esempio n. 3
0
 void handleProtocol(int pid, string jsonData)
 {
     // 这个方法应该由主线程调用
     try
     {
         string pName = string.Format("socket_{0}", pid);
         SFBaseResponseMessage obj = null;
         if (pid == int.MaxValue)
         {
         } // __start__
         else if (pid == 0)
         {
             obj = JsonUtility.FromJson <SFResponseMsgSocketHeartbeat>(jsonData);
         }
         else if (pid == 1)
         {
             obj = JsonUtility.FromJson <SFResponseMsgUnitLogin>(jsonData);
         }
         else if (pid == 2)
         {
             obj = JsonUtility.FromJson <SFResponseMsgNotifyRemoteUsers>(jsonData);
         }
         else if (pid == 3)
         {
             obj = JsonUtility.FromJson <SFResponseMsgUnitSync>(jsonData);
         }
         else if (pid == 4)
         {
             obj = JsonUtility.FromJson <SFResponseMsgNotifyUnitStatus>(jsonData);
         }
         else if (pid == 5)
         {
             obj = JsonUtility.FromJson <SFResponseMsgNotifyNewUserJoin>(jsonData);
         }
         else if (pid == 6)
         {
             obj = JsonUtility.FromJson <SFResponseMsgHostRoom>(jsonData);
         }
         else if (pid == 7)
         {
             obj = JsonUtility.FromJson <SFResponseMsgJoinRoom>(jsonData);
         }
         else // __end__
         {
             SFUtils.logWarning("不能识别的协议号: {0}", pid);
         }
         if (obj != null)
         {
             dispatcher.dispatchEvent(pName, obj);
         }
     }
     catch (Exception e)
     {
         SFUtils.logWarning("解析协议失败: {0}\ndata: {1}\n错误信息:{2}\n出错方法:{3}", pid, jsonData, e.Message, e.StackTrace);
     }
 }
Esempio n. 4
0
        void onLogoutResult(SFEvent e)
        {
            var data = e.data as SFResponseMsgUnitLogin;

            if (data.retCode == 0)
            {
                SFNetworkManager.instance.uninit();
                m_view.removeView();
                SFSceneManager.addView("vwLogin");
            }
            else
            {
                SFUtils.logWarning("登出失败");
            }
        }
Esempio n. 5
0
        public void update(float dt)
        {
            // 发送队列
            while (m_sendQueue.Count > 0)
            {
                SFBaseRequestMessage req = m_sendQueue.Dequeue();
                string data = JsonUtility.ToJson(req);
                m_client.sendData(data);
                if (req.pid != 0 && req.pid != 3)
                {
                    SFUtils.log("Sending message[{0}]: {1}", data.Length, data);
                }
            }

            // 接收队列
            while (m_recvQueue.Count > 0)
            {
                string data = m_recvQueue.Dequeue();
                SFBaseResponseMessage obj = null;
                try
                {
                    obj = JsonUtility.FromJson <SFBaseResponseMessage>(data);
                }
                catch
                {
                }
                if (obj != null)
                {
                    handleProtocol(obj.pid, data);
                    if (obj.pid != 0 && obj.pid != 3 && obj.pid != 4)
                    {
                        SFUtils.log("收到信息:协议号={0}\ndata={1}", obj.pid, data);
                    }
                }
                else
                {
                    SFUtils.logWarning("不能解析的信息格式:\n" + data);
                }
            }

            // 心跳包
            m_heartbeatTimer += dt;
            if (m_heartbeatTimer > SFCommonConf.instance.heatbeatInterval)
            {
                m_heartbeatTimer -= SFCommonConf.instance.heatbeatInterval;
                sendHeartbeat();
            }
        }
Esempio n. 6
0
 /// <summary>
 /// 添加一个监听
 /// </summary>
 /// <param name="eventType">事件类型</param>
 /// <param name="sel">需要添加的监听</param>
 /// <returns>是否添加成功</returns>
 public bool addEventListener(object listener, string eventType, SFListenerSelector sel)
 {
     if (eventType != "" && sel != null) // 判断有效性
     {
         if (hasEventListener(eventType, sel))
         {
             SFUtils.logWarning(string.Format("重复监听!type={0}", eventType));
         }
         if (!m_dictListeners.ContainsKey(eventType))
         {
             // 不存在的话就新建一个
             List <SFPairOfListenerAndSelector> newSelectors = new List <SFPairOfListenerAndSelector>();
             m_dictListeners[eventType] = newSelectors;
         }
         var selectors = m_dictListeners[eventType];
         var pair      = new SFPairOfListenerAndSelector(listener, sel);
         selectors.Add(pair);
         return(true);
     }
     return(false);
 }
Esempio n. 7
0
 /// <summary>
 /// 发送消息
 /// </summary>
 /// <param name="msg">要发送的消息</param>
 public void sendData(string msg)
 {
     if (!isReady || msg == "")
     {
         return;
     }
     try
     {
         // 编码
         byte[] data = Encoding.UTF8.GetBytes(msg + "\r\n\r\n");
         m_socket.BeginSend(data, 0, data.Length, SocketFlags.None, result =>
         {
             // 发送完成
             m_socket.EndSend(result);
         }, null);
         m_totalSend += data.Length;
     }
     catch (Exception e)
     {
         SFUtils.logWarning("Socket消息发送失败: " + e.Message);
     }
 }