private static void ExecuteCommand(NetworkStream stream, List <byte> container, bool AsyncExecution, OnMessageEventHandler onMessage, OnErrorEventHandler onError) { begin: for (var i = 0; i < container.Count - 1; i++) { if (container[i] == 0x0d && container[i + 1] == 0x0a) { if (onMessage != null) { var command = Encoding.UTF8.GetString(container.ToArray(), 0, i); if (AsyncExecution) { ThreadPool.QueueUserWorkItem(h => ExecuteMessage(stream, command, onMessage, onError)); } else { ExecuteMessage(stream, command, onMessage, onError); } } container.RemoveRange(0, i + 2); goto begin; } } }
private static void ExecuteMessage(NetworkStream stream, string command, OnMessageEventHandler onMessage, OnErrorEventHandler onError) { try { onMessage(stream, command); } catch (Exception ex) { if (onError != null) { onError(stream, ex); } } }
/// <summary> /// 读取对方传送的数据,分隔为一个或者多个命令行(以换行回车为结束符号),然后回调onMessage委托方法。 /// </summary> /// <param name="stream"></param> /// <param name="h"></param> /// <param name="buffer"></param> /// <param name="container"></param> /// <param name="AsyncExecution"></param> /// <param name="onMessage"></param> /// <param name="onError"></param> internal static void ExecuteRead(NetworkStream stream, IAsyncResult h, byte[] buffer, List <byte> container, bool AsyncExecution, OnMessageEventHandler onMessage, OnErrorEventHandler onError) { try { var len = stream.EndRead(h); for (var i = 0; i < len; i++) { container.Add(buffer[i]); } ExecuteCommand(stream, container, AsyncExecution, onMessage, onError); } catch (Exception ex) { if (onError != null) { onError(stream, ex); } } }
/// <summary> /// 注册方法 /// </summary> /// <param name="Message">消息头</param> /// <param name="go">消息接收物体</param> /// <param name="eventHandler">事件回调</param> public void RegisterMessages(string Message, GameObject go, OnMessageEventHandler eventHandler) { if (eventHandler == null) { Debug.LogError("请注册一个方法" + go + eventHandler); return; } if (!CenterPool.ContainsKey(Message)) { centerPool.Add(Message, new Dictionary <GameObject, OnMessageEventHandler>()); } if (!centerPool[Message].ContainsKey(go)) { centerPool[Message].Add(go, eventHandler); } else { Debug.Log("已经注册了方法"); } }