/// <summary> /// 注册回调方法 /// </summary> /// <param name="cmd1">指令1</param> /// <param name="cmd2">指令2</param> /// <param name="callback">回调方法</param> public void Register(ushort cmd1, ushort cmd2, GetClientDataCallBack callback) { uint key = NetworkUtils.EnumToKey(cmd1, cmd2); if (callbackDict.ContainsKey(key)) { return; } callbackDict.Add(key, callback); }
/// <summary> /// 更新(读取, 发送) /// </summary> public void Update() { //接受消息 while (client.Available > 0) { NetworkUtils.UnpackTCPMessage(client, out ushort cmd1, out ushort cmd2, out byte[] data); uint key = NetworkUtils.EnumToKey(cmd1, cmd2); if (callbackDict.ContainsKey(key)) { callbackDict[key](data); } } //发送消息 while (messagesToBeSend.Count > 0) { byte[] data = messagesToBeSend.Dequeue(); client.Send(data); } }
/// <summary> /// 更新(接受 发送) /// </summary> public void Update() { //接收消息 while (udp.Available > 0) { IPEndPoint iPEndPoint = null; byte[] data = udp.Receive(ref iPEndPoint); NetworkUtils.UnpackUDPMessage(data, out ushort cmd1, out ushort cmd2, out byte[] msgData); uint key = NetworkUtils.EnumToKey(cmd1, cmd2); if (callbackDict.ContainsKey(key)) { callbackDict[key](iPEndPoint, msgData); } } //发送消息 while (messagesToBeSend.Count > 0) { UdpMessage message = messagesToBeSend.Dequeue(); message.Send(udp); } }
/// <summary> /// 更新(接受, 读取, 发送) /// </summary> public void Update() { //异步接收客户端 if (accept) { try { acceptAsync = server.BeginAccept(null, null); accept = false; } catch (Exception) { } } if (acceptAsync.IsCompleted) { try { Socket socket = server.EndAccept(acceptAsync); Client client = new Client(true, socket); clients.Add(client); OnConnected?.Invoke(client); } catch (Exception) { } finally { accept = true; } } //异步接收消息 foreach (Client client in clients) { try { while (client.Socket.Available > 0) { NetworkUtils.UnpackTCPMessage(client.Socket, out ushort cmd1, out ushort cmd2, out byte[] data); uint key = NetworkUtils.EnumToKey(cmd1, cmd2); if (callbackDict.ContainsKey(key)) { //执行回调方法 callbackDict[key](client, data); } } } catch (Exception ex) { RemoveClient(client, ex.Message); } } List <Client> deleteClients = new List <Client>(); //异步发送消息 while (messagesToBeSend.Count > 0) { ClientMessage message = messagesToBeSend.Dequeue(); Client client = message.Client; if (!client.Connected) { deleteClients.Add(client); } else { try { client.Socket.Send(message.Data); } catch (Exception ex) { RemoveClient(client, ex.Message); deleteClients.Add(client); } } } foreach (Client item in deleteClients) { clients.Remove(item); } }