public void Register(ushort cmd1, ushort cmd2, CallbackEvent _event) { int key = NetworkSerializer.EnumToKey(cmd1, cmd2); if (events.ContainsKey(key)) { return; } events.Add(key, _event); }
public void Update() { //接受消息 if (client.Available > 0) { NetworkSerializer.UnpackTCPMessage(client, out ushort cmd1, out ushort cmd2, out byte[] data); int key = NetworkSerializer.EnumToKey(cmd1, cmd2); if (events.ContainsKey(key)) { events[key](data); } } //发送消息 while (messages.Count > 0) { byte[] data = messages.Dequeue(); client.Send(data); } }
public void Update() { //接收消息 if (udp.Available > 0) { IPEndPoint iPEndPoint = null; byte[] data = udp.Receive(ref iPEndPoint); NetworkSerializer.UnpackUDPMessage(data, out ushort cmd1, out ushort cmd2, out byte[] msgData); int key = NetworkSerializer.EnumToKey(cmd1, cmd2); if (events.ContainsKey(key)) { events[key](msgData); } } //发送消息 while (messages.Count > 0) { Message message = messages.Dequeue(); message.Send(udp); } }
public void Update() { //异步接收客户端 if (accept) { try { acceptAsync = server.BeginAccept(null, null); accept = false; } catch (Exception) { } } if (acceptAsync.IsCompleted) { try { Socket socket = server.EndAccept(acceptAsync); clients.Add(new Client(true, socket)); OnConnected?.Invoke(socket); } catch (Exception) { } finally { accept = true; } } //异步接收消息 foreach (Client client in clients) { if (!client.Connected) //不接受断开连接的消息 { continue; } Socket socket = client.Socket; if (socket.Available > 0) { try { NetworkSerializer.UnpackTCPMessage(socket, out ushort cmd1, out ushort cmd2, out byte[] data); int key = NetworkSerializer.EnumToKey(cmd1, cmd2); if (events.ContainsKey(key)) { events[key](socket, data); } } catch (Exception ex) { socket.Close(); client.Connected = false; OnDisconnected?.Invoke(ex.Message, socket); } } } //异步发送消息 while (messages.Count > 0) { Message message = messages.Dequeue(); Socket socket = message.Socket; bool pass = false; foreach (Client client in clients) { if (client.Socket == socket && client.Connected) //存在该客户端并且该客户端激活 { pass = true; break; } } if (!pass) { continue; } try { message.Send(); } catch (Exception ex) { socket.Close(); //禁用该Socket foreach (Client client in clients) { if (client.Socket == socket) { client.Connected = false; } } OnDisconnected?.Invoke(ex.Message, socket); break; } } }