Beispiel #1
0
        /// <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);
        }
Beispiel #2
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);
     }
 }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
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);
            }
        }