/// <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); }
/// <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); }
/// <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); }
/// <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); }
public static T ParseFromJson <T>(UDPModel uModel) { return(ParseFromJson <T>(uModel.Body, uModel.Length)); }
/// <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); }
/// <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); } } }