/// <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); }
/// <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); }
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); } }
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); }
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)); }
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); }
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); } }
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); } }
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("登出失败"); } }
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(); } }
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 = "服务器未连接"; } }
/// <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()); }
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); } }
/// <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); }
/// <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); }
/// <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); } }
/// <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("连接已关闭"); }
public void onViewRemoved() { SFUtils.log("SFTestView被关闭了"); }