/// <summary> /// 处理接受消息 /// </summary> void ReceiveMessage() { receiveCount = 0; // 单帧处理消息数量不大于指定的消息数量 while (receiveCount < MaxReceiveCount || !ProcUserMessage) { if (mClient == null) { Debug.LogErrorFormat("NetworkClient is null!"); break; } Packet packet = mClient.Receive(); if (packet == null) // 没有消息内容了,不用解析,退出循环 { break; } receiveCount++; // DefaultMessageIDTypes messageIDType = (DefaultMessageIDTypes)packet.data[0]; // LogMessage(messageIDType.ToString()); switch (packet.data[0]) { case (byte)DefaultMessageIDTypes.ID_CONNECTED_PING: // 0 case (byte)DefaultMessageIDTypes.ID_UNCONNECTED_PING: // 1 LogMessage(string.Format("Ping from {0}", packet.systemAddress.ToString(true))); break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED: //16 连接成功 { IsConnecting = false; IsConnectedServer = true; m_serverAddress = packet.systemAddress; m_guid = packet.guid; mClient.SetTimeoutTime(9000, m_serverAddress); NotifyConnectCallBack(true); } break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_ATTEMPT_FAILED: // 17 连接失败(多种原因) if (IsConnecting) { NotifyConnectCallBack(false); } DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_ALREADY_CONNECTED: // 18 已经存在 //Debug.Log("收到18消息"); DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_NO_FREE_INCOMING_CONNECTIONS: // 20 服务器满员了 DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); // Sorry, the server is full. I don't do anything here but // A real app should tell the user break; case (byte)DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION: // 21 丢失通知 DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_LOST: // 22 连接关闭 // Couldn't deliver a reliable packet - i.e. the other system was abnormally // terminated //Debug.Log("收到22消息"); DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_BANNED: // 23 服务器维护,强壮踢出所有人 if (IsConnecting) { NotifyConnectCallBack(false); } DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_INVALID_PASSWORD: // 24 无效的密码 break; case (byte)DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION: // 25 无效协议 break; case (byte)DefaultMessageIDTypes.ID_REMOTE_DISCONNECTION_NOTIFICATION: // 31 break; case (byte)DefaultMessageIDTypes.ID_REMOTE_CONNECTION_LOST: // 32 // Server telling the clients of another m_Client disconnecting forcefully. You can manually broadcast this in a peer to peer enviroment if you want. DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_REMOTE_NEW_INCOMING_CONNECTION: // 33 // Server telling the clients of another m_Client connecting. You can manually broadcast this in a peer to peer enviroment if you want. break; case (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM: // 134 case (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM2: // 135 if (ProcUserMessage == true) { Dispatch(packet); } break; default: // It's a m_Client, so just show the message LogMessage("Message ID Type default: " + packet.data[0]); break; } if (mClient != null) { mClient.DeallocatePacket(packet); } else { Debug.LogErrorFormat("DeallocatePacket NetworkClient:{0} is null!", ClientName); } } if (ProcUserMessage == false) { ProcUserMessage = true; // 抛出消息清除完毕的事件 //Debug.Log("c#清空消息完毕"); EventDispatcher.Instance.TriggerEvent("Application_ClearMessage_OK", null); } }
/// <summary> /// 处理接受消息 /// </summary> void ReceiveMessage() { receiveCount = 0; // 单帧处理消息数量不大于指定的消息数量 while (receiveCount < MaxReceiveCount || !ProcUserMessage) { Packet packet = mClient.Receive(); if (packet == null) // 没有消息内容了,不用解析,退出循环 { break; } receiveCount++; DefaultMessageIDTypes messageIDType = (DefaultMessageIDTypes)packet.data[0]; LogMessage(messageIDType.ToString()); switch (packet.data[0]) { case (byte)DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION: //DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_ALREADY_CONNECTED: //Debug.Log("收到18消息"); DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION: break; case (byte)DefaultMessageIDTypes.ID_REMOTE_DISCONNECTION_NOTIFICATION: // Server telling the clients of another m_Client disconnecting gracefully. You can manually broadcast this in a peer to peer enviroment if you want. break; case (byte)DefaultMessageIDTypes.ID_REMOTE_CONNECTION_LOST: // Server telling the clients of another m_Client disconnecting forcefully. You can manually broadcast this in a peer to peer enviroment if you want. DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_REMOTE_NEW_INCOMING_CONNECTION: // Server telling the clients of another m_Client connecting. You can manually broadcast this in a peer to peer enviroment if you want. break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_BANNED: // Banned from this server break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_ATTEMPT_FAILED: DisConnect(); //ShutDown(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_NO_FREE_INCOMING_CONNECTIONS: // 服务器满员了 DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); // Sorry, the server is full. I don't do anything here but // A real app should tell the user break; case (byte)DefaultMessageIDTypes.ID_INVALID_PASSWORD: // 无效的密码 break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_LOST: // Couldn't deliver a reliable packet - i.e. the other system was abnormally // terminated DisConnect(); EventDispatcher.Instance.TriggerEvent("Application_ConnectionLost", packet.data[0]); break; case (byte)DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED: // 连接成功 { IsConnectedServer = true; //LogMessage(string.Format("ID_CONNECTION_REQUEST_ACCEPTED to {0} with GUID {1}", packet.systemAddress.ToString(true), packet.guid.ToString())); //LogMessage(string.Format("My external address is {0}", mClient.GetExternalID(packet.systemAddress).ToString(true))); m_serverAddress = packet.systemAddress; m_guid = packet.guid; Debug.LogFormat("RakNetGUID:{0}", m_guid); mClient.SetTimeoutTime(9000, m_serverAddress); NotifyConnectCallBack(true); break; } case (byte)DefaultMessageIDTypes.ID_CONNECTED_PING: case (byte)DefaultMessageIDTypes.ID_UNCONNECTED_PING: LogMessage(string.Format("Ping from {0}", packet.systemAddress.ToString(true))); break; case (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM: case (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM2: if (ProcUserMessage == true) { Dispatch(packet); } break; default: // It's a m_Client, so just show the message LogMessage("Message ID Type default: " + packet.data[0]); break; } mClient.DeallocatePacket(packet); } if (ProcUserMessage == false) { ProcUserMessage = true; // 抛出消息清除完毕的事件 //Debug.Log("c#清空消息完毕"); EventDispatcher.Instance.TriggerEvent("Application_ClearMessage_OK", null); } }