private void ReceiveThread() { while (IsActive) { for (int i = 0; i < mClientSessions.Count; ++i) { Session clientSession = mClientSessions[i]; if (clientSession == null || clientSession.IsConnected == false) { continue; } try { int receiveSize = clientSession.TcpSocket.Receive(MessageBuffer.head, MessageBuffer.MESSAGE_HEAD_SIZE, SocketFlags.None); if (receiveSize == 0) { continue; // 消息大小为0 跳过 } if (receiveSize != MessageBuffer.MESSAGE_HEAD_SIZE) { continue; } if (MessageBuffer.IsValid(MessageBuffer.head) == false) { continue; } int bodySize = 0; if (MessageBuffer.Decode(MessageBuffer.head, MessageBuffer.MESSAGE_BODY_SIZE_OFFSET, ref bodySize) == false) { continue; } MessageBuffer message = new MessageBuffer(MessageBuffer.MESSAGE_HEAD_SIZE + bodySize); Array.Copy(MessageBuffer.head, 0, message.DataBuffer, 0, MessageBuffer.head.Length); if (bodySize > 0) { int receiveBodySize = clientSession.TcpSocket.Receive(message.DataBuffer, MessageBuffer.MESSAGE_BODY_OFFSET, bodySize, SocketFlags.None); if (receiveBodySize != bodySize) { continue; } } clientSession.OnReceiveMessageTCP(message); } catch (SocketException e) { Debug.Log("TCP SocketException 接收消息:" + e.Message); clientSession.Disconnect(); } catch (Exception e) { Debug.Error("TCP Exception 接收消息:" + e.Message); throw e; } } Thread.Sleep(1); } }
public void OnReceiveMessageKCP(byte[] data, IPEndPoint ip) { if (mKCP == null) { return; } lock (mKCP) { mKCP.Input(data); for (int size = mKCP.PeekSize(); size > 0; size = mKCP.PeekSize()) { MessageBuffer message = new MessageBuffer(size); if (mKCP.Recv(message.DataBuffer) > 0) { if (message.IsValid() && message.Extra() == Id) { if (udpAdress == null || udpAdress.Equals(ip) == false) { udpAdress = ip; } OnReceiveMessageKCP(message); } } } } }
private void ReceiveThread() { while (IsActive) { try { IPEndPoint ip = new IPEndPoint(IPAddress.Any, 0); byte[] data = Receive(ref ip); if (data.Length > 0) { Session c = TcpService.Instance.GetSession(ip); // 根据IP查找Session if (MessageBuffer.IsValid(data)) { var buffer = new MessageBuffer(data); if (c == null || c.Id != buffer.Extra()) { // 在根据Ip查找到的Session对应不上消息发送方Socket // 根据消息的ID查找Session c = TcpService.Instance.GetSession(buffer.Extra()); } if (c != null) { if (c.udpAdress == null || c.udpAdress.Equals(ip) == false) { c.udpAdress = ip; // 更新Session的IP地址 } c.OnReceiveMessageUDP(buffer); } } } Thread.Sleep(1); } catch (SocketException e) { Debug.Log("UDP接收消息:" + e.Message); continue; } catch (Exception e) { Debug.Error("UDP接收消息:" + e.Message); throw e; } } }