예제 #1
0
 /// <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);
     }
 }
예제 #2
0
        /// <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);
            }
        }