예제 #1
0
        private static HandleResult ProcessPacket(IServer sender, IntPtr id, Packet packet)
        {
            var result = HandleResult.Ignore;

            switch (packet.Type)
            {
            case PacketType.Echo:     // 假如回显是一个非耗时操作, 在这处理
            {
                // 回显数据
                var data = PacketHelper.ToSendBytes(packet);
                result = sender.Send(id, data, data.Length) ? HandleResult.Ok : HandleResult.Error;
                break;
            }

            case PacketType.Time:     // 假如获取服务器时间是耗时操作, 将该操作放入队列
            {
                // 向线程池提交任务
                if (!ThreadPool.Submit(ThreadProc, new { sender, id, packet }))     // 线程池传参, 这里使用的是匿名对象
                {
                    result = HandleResult.Error;
                }

                break;
            }

            default:
                result = HandleResult.Error;
                break;
            }
            return(result);
        }
예제 #2
0
        /// <summary>
        /// 线程池回调函数
        /// </summary>
        /// <param name="obj"></param>
        static void ThreadProc(object obj)
        {
            // 解构动态对象
            dynamic dyObj  = obj;
            IServer sender = dyObj.sender;
            IntPtr  id     = dyObj.id;
            Packet  packet = dyObj.packet;

            // 如果连接已经断开了(可能被踢了)
            // 它的任务就不做了(根据自己业务需求来, 也许你的任务就是要完成每个连接的所有任务, 每个包都要处理, 不管连接断开与否, 就不要写这个判断, 但是你回发包的时候要判断是否有效连接)
            if (!sender.IsConnected(id))
            {
                return;
            }

            if (packet.Type != PacketType.Time)
            {
                return;
            }

            // 模拟耗时操作
            System.Threading.Thread.Sleep(6000);

            // 组织回包
            packet = new Packet
            {
                Type = PacketType.Time,
                Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
            };

            // 发送数据
            var data = PacketHelper.ToSendBytes(packet);

            if (!sender.Send(id, data, data.Length))
            {
                // 发送失败断开连接
                sender.Disconnect(id);
            }
        }