/// <summary> /// Class constructor. /// </summary> /// <param name="aPlayerModel">PlayerModel class stored in this class from ClientMain.</param> /// <param name="ServerIP">Server IP to connect on it.</param> /// <param name="ServerPort">Server port to connect on it.</param> public ClientNetwork(PlayerModel aPlayerModel, string ServerIP, int ServerPort) { this.m_netConfiguration = new NetPeerConfiguration("LOGMultiplayer"); this.m_netClient = new NetClient(m_netConfiguration); this.m_netClient.Start(); // Start netClient. this.m_playerModel = aPlayerModel; NetOutgoingMessage netOutgoingMessage = this.m_netClient.CreateMessage(); IGameMessage gameMessage = new ConnectionApprovalRequestMessage { Version = APIMain.Version, Username = this.m_playerModel.Username }; netOutgoingMessage.Write((byte)gameMessage.MessageType); gameMessage.EncodeMessage(netOutgoingMessage); this.m_netClient.Connect(ServerIP, Convert.ToInt32(ServerPort), netOutgoingMessage); this.m_vesselManager = new VesselManager(this.m_netClient); this.m_playerModel.messageHandler.OnVesselUpdateState += this.m_vesselManager.HandleVesselMessage; }
/// <summary> /// Class constructor. /// </summary> /// <param name="aPlayerModel">PlayerModel class stored in this class from ClientMain.</param> /// <param name="ServerIP">Server IP to connect on it.</param> /// <param name="ServerPort">Server port to connect on it.</param> public ClientNetwork(PlayerModel aPlayerModel, string ServerIP, int ServerPort) { this.m_netConfiguration = new NetPeerConfiguration("LOGMultiplayer"); this.m_netClient = new NetClient(m_netConfiguration); this.m_netClient.Start(); // Start netClient. this.m_playerModel = aPlayerModel; NetOutgoingMessage netOutgoingMessage = this.m_netClient.CreateMessage(); IGameMessage gameMessage = new ConnectionApprovalRequestMessage { Version = APIMain.Version, Username = this.m_playerModel.Username }; netOutgoingMessage.Write((byte)gameMessage.MessageType); gameMessage.EncodeMessage(netOutgoingMessage); this.m_netClient.Connect(ServerIP, Convert.ToInt32(ServerPort), netOutgoingMessage); this.m_vesselManager = new VesselManager(this.m_netClient); this.m_playerModel.messageHandler.OnVesselUpdateState += this.m_vesselManager.HandleVesselMessage; }
/// <summary> /// Handle messages from server or client and choose what to do with them. /// </summary> private void HandleMessage() { NetIncomingMessage netIncomingMessage; while ((netIncomingMessage = m_netServer.ReadMessage()) != null) { switch (netIncomingMessage.MessageType) { case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.VerboseDebugMessage: { Log.HandleLog(LOGMessageTypes.Debug, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.WarningMessage: { Log.HandleLog(LOGMessageTypes.Warning, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.ErrorMessage: { Log.HandleLog(LOGMessageTypes.Error, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.UnconnectedData: { switch ((ServerMessageTypes)netIncomingMessage.ReadByte()) { case ServerMessageTypes.RequestPing: { NetOutgoingMessage netOutgoingMessage = this.m_netServer.CreateMessage(); netOutgoingMessage.Write((byte)ServerMessageTypes.RequestPing); netOutgoingMessage.Write(this.m_netServer.UniqueIdentifier); this.m_netServer.SendUnconnectedMessage(netOutgoingMessage, netIncomingMessage.SenderEndPoint); break; } } break; } /*case NetIncomingMessageType.DiscoveryRequest: { NetOutgoingMessage ResponseMessage = this.m_netServer.CreateMessage(); IGameMessage gameMessage = new DiscoveryRequestMessage { Hostname = "L.O.G. Server", Players = this.m_netServer.Connections.Count, MaximumPlayers = 32 }; gameMessage.EncodeMessage(ResponseMessage); this.m_netServer.SendDiscoveryResponse(ResponseMessage, netIncomingMessage.SenderEndPoint); break; }*/ case NetIncomingMessageType.StatusChanged: { switch ((NetConnectionStatus)netIncomingMessage.ReadByte()) { case NetConnectionStatus.RespondedConnect: Log.HandleLog(LOGMessageTypes.Info, "Incoming connection from", netIncomingMessage.SenderEndPoint); break; case NetConnectionStatus.Connected: Log.HandleLog(LOGMessageTypes.Info, this.m_playersList[netIncomingMessage.SenderConnection].Username, "has joined the server"); break; case NetConnectionStatus.Disconnected: Log.HandleLog(LOGMessageTypes.Info, this.m_playersList[netIncomingMessage.SenderConnection].Username, "has left the server"); break; } break; } case NetIncomingMessageType.ConnectionApproval: { GameMessageTypes gameMessageType = (GameMessageTypes)netIncomingMessage.SenderConnection.RemoteHailMessage.ReadByte(); if (gameMessageType != GameMessageTypes.ConnectionApprovalRequest) break; ConnectionApprovalRequestMessage Message = new ConnectionApprovalRequestMessage(netIncomingMessage.SenderConnection.RemoteHailMessage); if (Message.Version == APIMain.Version && Message.Username != null && Message.Username.Length > 0) { netIncomingMessage.SenderConnection.Approve(this.m_netServer.CreateMessage()); this.m_playersList.Add(netIncomingMessage.SenderConnection, new PlayerModel(netIncomingMessage.SenderConnection, Message.Username)); } else { netIncomingMessage.SenderConnection.Deny("Wrong version or username!"); } break; } case NetIncomingMessageType.Data: { this.m_playersList[netIncomingMessage.SenderConnection].messageHandler.HandleGameMessage(netIncomingMessage); break; } default: { Log.HandleLog(LOGMessageTypes.Error, String.Format("Unhandled type: {0} {1} bytes {2} | {3}", netIncomingMessage.MessageType, netIncomingMessage.LengthBytes, netIncomingMessage.DeliveryMethod, netIncomingMessage.SequenceChannel)); break; } } this.m_netServer.Recycle(netIncomingMessage); } }
/// <summary> /// Handle messages from server or client and choose what to do with them. /// </summary> private void HandleMessage() { NetIncomingMessage netIncomingMessage; while ((netIncomingMessage = m_netServer.ReadMessage()) != null) { switch (netIncomingMessage.MessageType) { case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.VerboseDebugMessage: { Log.HandleLog(LOGMessageTypes.Debug, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.WarningMessage: { Log.HandleLog(LOGMessageTypes.Warning, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.ErrorMessage: { Log.HandleLog(LOGMessageTypes.Error, netIncomingMessage.ReadString()); break; } case NetIncomingMessageType.UnconnectedData: { switch ((ServerMessageTypes)netIncomingMessage.ReadByte()) { case ServerMessageTypes.RequestPing: { NetOutgoingMessage netOutgoingMessage = this.m_netServer.CreateMessage(); netOutgoingMessage.Write((byte)ServerMessageTypes.RequestPing); netOutgoingMessage.Write(this.m_netServer.UniqueIdentifier); this.m_netServer.SendUnconnectedMessage(netOutgoingMessage, netIncomingMessage.SenderEndPoint); break; } } break; } /*case NetIncomingMessageType.DiscoveryRequest: * { * NetOutgoingMessage ResponseMessage = this.m_netServer.CreateMessage(); * * IGameMessage gameMessage = new DiscoveryRequestMessage * { * Hostname = "L.O.G. Server", * Players = this.m_netServer.Connections.Count, * MaximumPlayers = 32 * }; * * gameMessage.EncodeMessage(ResponseMessage); * * this.m_netServer.SendDiscoveryResponse(ResponseMessage, netIncomingMessage.SenderEndPoint); * * break; * }*/ case NetIncomingMessageType.StatusChanged: { switch ((NetConnectionStatus)netIncomingMessage.ReadByte()) { case NetConnectionStatus.RespondedConnect: Log.HandleLog(LOGMessageTypes.Info, "Incoming connection from", netIncomingMessage.SenderEndPoint); break; case NetConnectionStatus.Connected: Log.HandleLog(LOGMessageTypes.Info, this.m_playersList[netIncomingMessage.SenderConnection].Username, "has joined the server"); break; case NetConnectionStatus.Disconnected: Log.HandleLog(LOGMessageTypes.Info, this.m_playersList[netIncomingMessage.SenderConnection].Username, "has left the server"); break; } break; } case NetIncomingMessageType.ConnectionApproval: { GameMessageTypes gameMessageType = (GameMessageTypes)netIncomingMessage.SenderConnection.RemoteHailMessage.ReadByte(); if (gameMessageType != GameMessageTypes.ConnectionApprovalRequest) { break; } ConnectionApprovalRequestMessage Message = new ConnectionApprovalRequestMessage(netIncomingMessage.SenderConnection.RemoteHailMessage); if (Message.Version == APIMain.Version && Message.Username != null && Message.Username.Length > 0) { netIncomingMessage.SenderConnection.Approve(this.m_netServer.CreateMessage()); this.m_playersList.Add(netIncomingMessage.SenderConnection, new PlayerModel(netIncomingMessage.SenderConnection, Message.Username)); } else { netIncomingMessage.SenderConnection.Deny("Wrong version or username!"); } break; } case NetIncomingMessageType.Data: { this.m_playersList[netIncomingMessage.SenderConnection].messageHandler.HandleGameMessage(netIncomingMessage); break; } default: { Log.HandleLog(LOGMessageTypes.Error, String.Format("Unhandled type: {0} {1} bytes {2} | {3}", netIncomingMessage.MessageType, netIncomingMessage.LengthBytes, netIncomingMessage.DeliveryMethod, netIncomingMessage.SequenceChannel)); break; } } this.m_netServer.Recycle(netIncomingMessage); } }