예제 #1
0
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="state"></param>
        private void HandleMessage(object state)
        {
            UDPModel uModel = state as UDPModel;

            if (uModel == null)
            {
                return;
            }

            do
            {
                string message = Encoding.UTF8.GetString(uModel.Body, 0, uModel.Length);

                Socket socket = SocketRegister.Get(UDPPrimaryKey.UDPServerSocket);
                if (socket == null)
                {
                    break;
                }

                if (string.IsNullOrEmpty(message))
                {
                    break;
                }

                //三次握手

                if (message == Handshake1)
                {
                    UDPSocketServer.SendMessage(socket, Handshake2, uModel.IPPoint);
                    break;
                }

                if (message == Handshake3)
                {
                    break;
                }

                KevSocketModel ksModel = JsonHelper.ParseFromJson <KevSocketModel>(message);
                if (ksModel == null)
                {
                    break;
                }

                int responseCode = UDPServerRouteHelper.GetInstanse().HandleMessage(ksModel, uModel);
                if (ksModel.NetworkType == NetworkType.Request && responseCode != ResponseCode.NoResponse)
                {
                    ksModel.NetworkType  = NetworkType.Response;
                    ksModel.ResponseCode = responseCode;

                    //做出响应
                    UDPSocketServer.SendMessage(socket, ksModel, uModel.IPPoint);
                }
            } while (false);
        }
예제 #2
0
        /// <summary>
        /// 开始
        /// </summary>
        /// <returns></returns>
        public bool Start()
        {
            isRuning = true;
            thread   = new Thread(() =>
            {
                Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                if (this.BindIPPoint == null)
                {
                    throw new Exception("IPPoint must be a valid value");
                }

                socketServer.Bind(this.BindIPPoint);

                SocketRegister.Add(UDPPrimaryKey.UDPServerSocket, socketServer);

                while (isRuning)
                {
                    byte[] data       = new byte[8 * 1024];
                    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                    EndPoint Remote   = (EndPoint)(sender);
                    int recv;
                    try
                    {
                        recv = socketServer.ReceiveFrom(data, ref Remote);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        continue;
                    }

                    UDPModel udpModel = new UDPModel {
                        Body = data, IPPoint = (IPEndPoint)Remote, Length = recv
                    };
                    ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), udpModel);
                }
            });

            thread.IsBackground = true;
            thread.Start();

            return(true);
        }
예제 #3
0
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="ksModel"></param>
        /// <param name="uModel"></param>
        /// <returns></returns>
        internal int HandleMessage(KevSocketModel ksModel, UDPModel uModel)
        {
            int result_code = 200;

            do
            {
                if (ksModel == null)
                {
                    result_code = 401;
                    break;
                }

                IUDPServerDelegate del = GetDelegate(ksModel.MessageType);
                if (del == null)
                {
                    result_code = 402;
                    break;
                }

                result_code = del.HandleRequestMessage(uModel);
            } while (false);

            return(result_code);
        }
예제 #4
0
        /// <summary>
        /// 处理响应消息
        /// </summary>
        /// <param name="ksModel"></param>
        /// <param name="uModel"></param>
        /// <returns></returns>
        public int HandleResponseMessage(KevSocketModel ksModel, UDPModel uModel)
        {
            int result_code = ResponseCode.Success;

            do
            {
                if (ksModel == null)
                {
                    result_code = ResponseCode.NotFindKevSocketModel;
                    break;
                }

                IUDPClientDelegate del = GetDelegate(ksModel.MessageType);
                if (del == null)
                {
                    result_code = ResponseCode.NotRegisteredType;
                    break;
                }

                result_code = del.HandleResponseMessage(uModel);
            } while (false);

            return(result_code);
        }
예제 #5
0
 public static T ParseFromJson <T>(UDPModel uModel)
 {
     return(ParseFromJson <T>(uModel.Body, uModel.Length));
 }
예제 #6
0
        /// <summary>
        /// 开始
        /// </summary>
        /// <returns></returns>
        public bool Start()
        {
            isRuning = true;

            Socket socket_client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            if (this.ServerIPPoint == null)
            {
                throw new Exception("IPPoint must be a valid value");
            }

            socket_client.SendTo(Encoding.UTF8.GetBytes(Handshake1), ServerIPPoint);
            SocketRegister.Add(SocketClient, socket_client);

            Thread thread = new Thread(() =>
            {
                EndPoint remoteEP = (EndPoint) new IPEndPoint(IPAddress.Any, 0);

                while (isRuning)
                {
                    int recv;
                    byte[] datas = new byte[8 * 1024];
                    try
                    {
                        recv = socket_client.ReceiveFrom(datas, ref remoteEP);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        continue;
                    }

                    UDPModel udpModel = new UDPModel {
                        Body = datas, IPPoint = (IPEndPoint)remoteEP, Length = recv
                    };
                    ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), udpModel);
                }
            });

            thread.IsBackground = true;
            thread.Start();

            Thread thread_deepMessage = new Thread(() =>
            {
                while (isRuning)
                {
                    Thread.Sleep(100);
                    KevMessageBoxModel kmbModel = KevMessageBox.GetFirstMessage();
                    if (kmbModel == null)
                    {
                        continue;
                    }

                    if (kmbModel.TimeOut.Ticks <= DateTime.Now.Ticks)
                    {
                        //跳转到超时
                        ThreadPool.QueueUserWorkItem(new WaitCallback(HandleTimeOutMessage), kmbModel);
                    }
                    else
                    {
                        KevMessageBox.Enqueue(kmbModel.SocketModel.MessageId, kmbModel);
                    }
                }
            });

            thread_deepMessage.IsBackground = true;
            thread_deepMessage.Start();

            return(true);
        }
예제 #7
0
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="state"></param>
        private void HandleMessage(object state)
        {
            UDPModel uModel = state as UDPModel;

            if (uModel == null)
            {
                return;
            }

            string message = Encoding.UTF8.GetString(uModel.Body, 0, uModel.Length);

            if (string.IsNullOrEmpty(message))
            {
                return;
            }

            Socket socket = SocketRegister.Get(SocketClient);

            if (socket == null)
            {
                return;
            }

            if (message == Handshake2)
            {
                UDPSocketServer.SendMessage(socket, Handshake3, uModel.IPPoint);
            }

            KevSocketModel ksModel = JsonHelper.ParseFromJson <KevSocketModel>(message);

            if (ksModel == null)
            {
                return;
            }

            Console.WriteLine("HandleMessage" + ksModel.MessageId + "::" + ksModel.MessageType);

            if (ksModel.NetworkType == NetworkType.Request)
            {
                long clientId = KevRegister.Get <long>(UDPPrimaryKey.Client_ThisDeviceId);

                //非指向本机请求一律抛弃
                if (ksModel.ReceiveDeviceId != clientId)
                {
                    return;
                }

                int responseCode = UDPClientRouteHelper.GetInstanse().HandleRequestMessage(ksModel, uModel);
                if (responseCode == ResponseCode.NoResponse)
                {
                    return;
                }

                ksModel.NetworkType  = NetworkType.Response;
                ksModel.ResponseCode = responseCode;

                //做出相应

                UDPSocketServer.SendMessage(socket, ksModel, uModel.IPPoint);
            }

            if (ksModel.NetworkType == NetworkType.Response)
            {
                //从消息盒子中移除数据
                KevMessageBoxModel kmbModel = KevMessageBox.GetMessage(ksModel.MessageId);
                if (kmbModel != null)
                {
                    UDPClientRouteHelper.GetInstanse().HandleResponseMessage(ksModel, uModel);
                }
            }
        }