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 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 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(); } }
/// <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> /// 发送消息 /// </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); } }