Пример #1
0
 /// <summary>
 /// 初始化TCP客户端
 /// </summary>
 /// <param name="ip">目标主机的IP地址</param>
 /// <param name="port">端口</param>
 /// <param name="callback">处理数据的回调函数</param>
 public void init(string ip, int port, SFClientCallback callback, SFSocketStateCallback stateCallback)
 {
     m_ipend         = new IPEndPoint(IPAddress.Parse(ip), port);
     m_socket        = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     m_callback      = callback;
     m_stateCallback = stateCallback;
     m_isReady       = false;
     m_totalSend     = 0;
     m_totalRecv     = 0;
     m_startTime     = SFUtils.getTimeStampNow();
     m_recvBuffer    = "";
     m_socket.BeginConnect(m_ipend, result =>
     {
         try
         {
             m_socket.EndConnect(result);
             m_isReady = true;
             m_stateCallback((int)ESocketState.eST_OK);
             socketRecv();
         }
         catch (Exception)
         {
             m_stateCallback((int)ESocketState.eST_Error);
         }
     }, null);
 }
Пример #2
0
        /// <summary>
        /// 输出日志,同时输出到Unity控制台和外部log文件
        /// </summary>
        /// <param name="level">日志等级</param>
        /// <param name="msg">日志信息</param>
        /// <param name="paras">参数列表</param>
        static public void logLevel(int level, string msg, params object[] paras)
        {
            string logStr = msg;

            if (paras.Length > 0)
            {
                logStr = string.Format(msg, paras);
            }
            if (level == LOG_LEVEL_WARNING)
            {
                Debug.LogWarning(logStr);
                logStr = "[WARNING] - " + logStr;
            }
            else if (level == LOG_LEVEL_ERROR)
            {
                Debug.LogError(logStr);
                logStr = "  [ERROR] - " + logStr;
            }
            else
            {
                Debug.Log(logStr);
                logStr = " [INFO-" + level.ToString() + "] - " + logStr;
            }
            SFUtils.logToFile(logStr);
        }
Пример #3
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);
     }
 }
Пример #4
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);
 }
Пример #5
0
        void onOk(SFEvent e)
        {
            m_view.lblTitle.text = "Button Clicked!";
            m_view.btnOk.SetText("修改了button的Text");
            var md5 = SFUtils.getMD5("Abcd.1234@BA!");

            SFUtils.log(SFUtils.getMD5(md5));
        }
Пример #6
0
        void onHeartbeat(SFEvent e)
        {
            var now  = DateTime.Now;
            var diff = now.Subtract(m_heartbeatStartTime);

            m_ping = diff.TotalMilliseconds;
            SFUtils.log("ping: {0:F2}", m_ping);
            dispatcher.dispatchEvent(SFEvent.EVENT_NETWORK_PING);
        }
Пример #7
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);
     }
 }
Пример #8
0
        void onLifeChange(SFEvent e)
        {
            var data = e.data as SFUnitLifeChange;

            if (data.uid == SFUserData.instance.uid)
            {
                m_view.proLife.setProgress(1.0f * data.curLife / data.maxLife);
                SFUtils.log("当前血量{0}/{1}", data.curLife, data.maxLife);
            }
        }
Пример #9
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("登出失败");
            }
        }
Пример #10
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();
            }
        }
Пример #11
0
 void onSend(SFEvent e)
 {
     if (m_mgr.isReady())
     {
         string content = m_view.txtMsg.text;
         SFUtils.log("正在发送 " + content);
         SFRequestMsgUnitLogin req = new SFRequestMsgUnitLogin();
         req.uid        = "abc";
         req.loginOrOut = 1;
         m_mgr.sendMessage(req);
     }
     else
     {
         m_infoMsg = "服务器未连接";
     }
 }
Пример #12
0
 /// <summary>
 /// 移除来自某对象的所有监听
 /// </summary>
 /// <param name="target">Target.</param>
 public void removeAllEventListenersWithTarget(object target)
 {
     foreach (var item in m_dictListeners)
     {
         var pairs = item.Value;
         for (int i = pairs.Count - 1; i >= 0; --i)
         {
             var pair = pairs[i];
             if (pair.listener.GetHashCode() == target.GetHashCode())
             {
                 pairs.Remove(pair);
             }
         }
     }
     SFUtils.log("removeAllEventListenersWithTarget by " + target.ToString());
 }
Пример #13
0
        void onRemoteUsers(SFEvent e)
        {
            var data = e.data as SFResponseMsgNotifyRemoteUsers;

            if (data.retCode == 0)
            {
                SFBattleData.instance.enterBattle_mapId       = data.mapId;
                SFBattleData.instance.enterBattle_remoteUsers = data.users;
                SFBattleData.instance.enterBattle_posX        = data.posX;
                SFBattleData.instance.enterBattle_posY        = data.posY;
                SFBattleData.instance.enterBattle_rotation    = data.rotation;
                SFBattleData.instance.enterBattle_maxLife     = data.maxLife;
                SFBattleData.instance.enterBattle_initRunTime = data.runTime;

                SFUtils.log("玩家初始坐标:({0}, {1}),rot={2}", data.posX, data.posY, data.rotation);
            }
        }
Пример #14
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);
 }
Пример #15
0
        /// <summary>
        /// 查找某GO下的子物体,注意这个方法会消耗相当多的时间,最好不要在update里调用
        /// 如果有多个同名的子物体,只会返回第一个
        /// </summary>
        /// <returns>子物体</returns>
        /// <param name="parent">父物体</param>
        /// <param name="childName">子物体的name</param>
        static public GameObject findChildWithParent(GameObject parent, string childName)
        {
            Transform parentTrans = parent.transform;

            foreach (Transform trans in parentTrans.GetComponentInChildren <Transform>())
            {
                if (trans.name == childName)
                {
                    return(trans.gameObject);
                }
                else
                {
                    var child = SFUtils.findChildWithParent(trans.gameObject, childName);
                    if (child != null)
                    {
                        return(child);
                    }
                }
            }
            return(null);
        }
Пример #16
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);
     }
 }
Пример #17
0
        /// <summary>
        /// 关闭TCP客户端
        /// </summary>
        public void uninit()
        {
            if (m_socket != null)
            {
                if (m_socket.Connected)
                {
                    m_socket.Disconnect(false);
                }
                m_socket.Close();
                m_socket = null;
            }
            m_isReady = false;
            long  endTime   = SFUtils.getTimeStampNow();
            float totalTime = endTime - m_startTime;

            if (totalTime < 1)
            {
                totalTime = 1;
            }
            SFUtils.log("共发送{0:F2} KB, 共接收{0:F2} KB", totalSendLength / 1024.0, totalRecvLength / 1024.0);
            SFUtils.log("平均流量:{0:F2} KB/sec", 1.0 * (totalSendLength + totalRecvLength) / totalTime / 1024.0);
            SFUtils.log("连接已关闭");
        }
Пример #18
0
 public void onViewRemoved()
 {
     SFUtils.log("SFTestView被关闭了");
 }