void OnData(DataStreamReader stream) { NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp); stream.ReadBytes(bytes); //Get bytes string recMsg = Encoding.ASCII.GetString(bytes.ToArray()); //convert bytes to JSON string NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); //convert JSON to c# class switch (header.cmd) { case Commands.HANDSHAKE: HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg); Debug.Log("Handshake message received!"); break; case Commands.PLAYER_INTERNALID: PlayerUpdateMsg internalId = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("Got internalId from server"); playerInfo.player.id = internalId.player.id; playerInternalIdText.text = playerInfo.player.id; break; case Commands.PLAYER_UPDATE: PlayerUpdateMsg puMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); //Debug.Log("Player update message received!"); Debug.Log("Got data from server, player Pos: " + puMsg.player.pos); break; case Commands.SERVER_UPDATE: ServerUpdateMsg suMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("Server update message received!"); UpdateClientsInfo(suMsg); break; //To spawn existed players case Commands.SPAWN_EXISTED_PLAYERS: ServerUpdateMsg existedPlayerInfo = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("existed player info received!"); SpawnExistedPlayer(existedPlayerInfo); break; //Spawn new player case Commands.SPAWN_NEW_PLAYER: PlayerUpdateMsg newPlayerInfo = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("new client info received!"); SpawnNewPlayer(newPlayerInfo); break; //handle disconnected player case Commands.DISCONNECTED_PLAYER: DisconnectedPlayersMsg dpm = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg); Debug.Log("Disconnected player info recieved!"); DeleteDisconnectPlayer(dpm); break; default: Debug.Log("Unrecognized message received!"); break; } }
void OnData(DataStreamReader stream) { NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp); stream.ReadBytes(bytes); //Get bytes string recMsg = Encoding.ASCII.GetString(bytes.ToArray()); //convert bytes to JSON string NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); //convert JSON to c# class switch (header.cmd) { case Commands.HANDSHAKE: HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg); Debug.Log("Handshake message received!"); break; case Commands.PLAYER_WHOAMI: PlayerUpdateMsg internalId = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("Got internalId from server"); playerInfo.player.id = internalId.player.id; playerIDText.SetText(playerInfo.player.id); myIDLabel.SetText(playerInfo.player.id); break; case Commands.PLAYER_UPDATE: PlayerUpdateMsg puMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("Got data from server, player Pos: " + puMsg.player.pos); break; case Commands.SERVER_UPDATE: ServerUpdateMsg suMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("Server update message received!"); UpdateClientsInfo(suMsg); break; case Commands.ALREADY_HERE_PLAYERS: ServerUpdateMsg alreadyHerePlayerInfo = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("existed player info received!"); SpawnPlayersAlreadyHere(alreadyHerePlayerInfo); break; case Commands.SPAWN_NEW_PLAYER: PlayerUpdateMsg newPlayerMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("new client info received!"); SpawnNewPlayer(newPlayerMsg); break; case Commands.DISCONNECTED_PLAYER: DisconnectedPlayersMsg dpMsg = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg); Debug.Log("Player disconnected :("); DeleteDisconnectPlayer(dpMsg); break; default: Debug.Log("Unrecognized message received!"); break; } }
void DeleteDisconnectPlayer(DisconnectedPlayersMsg dcMsg) { for (int i = 0; i < dcMsg.disconnectedPlayers.Count; ++i) { if (connectedClientsDict.ContainsKey(dcMsg.disconnectedPlayers[i])) { Destroy(connectedClientsDict[dcMsg.disconnectedPlayers[i]]); connectedClientsDict.Remove(dcMsg.disconnectedPlayers[i]); } } }
void DeleteDisconnectPlayer(DisconnectedPlayersMsg data) { for (int i = 0; i < data.disconnectedPlayers.Count; ++i) { if (listOfClients.ContainsKey(data.disconnectedPlayers[i])) { Destroy(listOfClients[data.disconnectedPlayers[i]]); listOfClients.Remove(data.disconnectedPlayers[i]); } } }
void AssertHeartbeatTime() { //Check for heartbeat time, if its > 10 seconds delete the client: //Create a new list for the deleted clients List <string> DroppedClientList = new List <string>(); //loop through our heartbeat objects and compare the time in heartbeat //with the current time, if its > 10 seconds: foreach (KeyValuePair <string, float> item in heartbeat) { if (Time.time - item.Value >= 10f) { //Add the client to the list for deletion DroppedClientList.Add(item.Key); } } //If we have clients to be deleted: if (DroppedClientList.Count != 0) { //Remove the client from both our connected players and heartbeat //If you do not do this you will crash the server... for (int i = 0; i < DroppedClientList.Count; ++i) { PlayersConnected.Remove(DroppedClientList[i]); heartbeat.Remove(DroppedClientList[i]); } DisconnectedPlayersMsg DCMSG = new DisconnectedPlayersMsg(); DCMSG.DROPPEDPLAYERLIST = DroppedClientList; // Send message to all clients for (int i = 0; i < m_Connections.Length; i++) { if (DroppedClientList.Contains(m_Connections[i].InternalId.ToString()) == true) { continue; } Assert.IsTrue(m_Connections[i].IsCreated); SendToClient(JsonUtility.ToJson(DCMSG), m_Connections[i]); } } }
void HeartBeatCheck() { //Check heartBeat List <string> deleteList = new List <string>(); foreach (KeyValuePair <string, float> element in clientsHeartBeat) { //If client does not send msg over 5seconds... if (Time.time - element.Value >= 5f) { Debug.Log(element.Key.ToString() + "heatbeat disconnected"); deleteList.Add(element.Key); } } if (deleteList.Count != 0) { //Delete disconnected client from list for (int i = 0; i < deleteList.Count; ++i) { listOfClients.Remove(deleteList[i]); clientsHeartBeat.Remove(deleteList[i]); } DisconnectedPlayersMsg dpm = new DisconnectedPlayersMsg(); dpm.disconnectedPlayers = deleteList; //Send message to all client for (int i = 0; i < m_Connections.Length; i++) { //If disconnected connection.. continue if (deleteList.Contains(m_Connections[i].InternalId.ToString()) == true) { continue; } Assert.IsTrue(m_Connections[i].IsCreated); //only when it's true SendToClient(JsonUtility.ToJson(dpm), m_Connections[i]); } } }
void checkForUpdate() { List <string> deleteList = new List <string>(); foreach (KeyValuePair <string, float> element in heartbeat) { // If the client is gone for longer than 5 seconds if (Time.time - element.Value >= 5f) { Debug.Log(element.Key.ToString() + "stopped sending updates!"); deleteList.Add(element.Key); // add them to a list of clients to delete from the list } } if (deleteList.Count != 0) { //Delete disconnected client from list for (int i = 0; i < deleteList.Count; ++i) { connectedClientsDict.Remove(deleteList[i]); heartbeat.Remove(deleteList[i]); } DisconnectedPlayersMsg dpMsg = new DisconnectedPlayersMsg(); dpMsg.disconnectedPlayers = deleteList; // Send message to all clients for (int i = 0; i < m_Connections.Length; i++) { if (deleteList.Contains(m_Connections[i].InternalId.ToString()) == true) { continue; } Assert.IsTrue(m_Connections[i].IsCreated); SendToClient(JsonUtility.ToJson(dpMsg), m_Connections[i]); } } }
void OnData(DataStreamReader stream) { NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp); stream.ReadBytes(bytes); string recMsg = Encoding.ASCII.GetString(bytes.ToArray()); NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); switch (header.cmd) { case Commands.HANDSHAKE: HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg); Debug.Log("Handshake message received!"); break; case Commands.GETMYID: PlayerUpdateMsg MyIdMessage = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("Got My ID"); MyPlayerInformation.player.id = MyIdMessage.player.id; myID = MyPlayerInformation.player.id; break; case Commands.PLAYER_UPDATE: PlayerUpdateMsg IncomingMessage = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("Client Updated By Server"); break; case Commands.SERVER_UPDATE: ServerUpdateMsg ServerUpdateMessage = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("Sent Server my Update"); //Loop through players in the server update mssg for (int i = 0; i < ServerUpdateMessage.players.Count; ++i) { //if the player has an id matching i if (AllConnectedPlayers.ContainsKey(ServerUpdateMessage.players[i].id)) { //Change MY version of that players position and color to match the server AllConnectedPlayers[ServerUpdateMessage.players[i].id].transform.position = ServerUpdateMessage.players[i].pos; AllConnectedPlayers[ServerUpdateMessage.players[i].id].GetComponent <Renderer>().material.color = ServerUpdateMessage.players[i].color; //if the player is flagged as dropped on the server, flag it as dropped for me. if (ServerUpdateMessage.players[i].isDropped) { AllConnectedPlayers[ServerUpdateMessage.players[i].id].GetComponent <PlayerController>().isDropped = true; } } //However if the id matches my current client id else if (MyPlayerInformation.player.id == ServerUpdateMessage.players[i].id) { //do the same stuff for just me. ignore position as we do that on client side with input. PlayerTransform.GetComponent <Renderer>().material.color = ServerUpdateMessage.players[i].color; MyPlayerInformation.player.color = ServerUpdateMessage.players[i].color; } } break; case Commands.GETEXISITNGPLAYERS: ServerUpdateMsg ExistingPlayersMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); Debug.Log("existed player info received!"); //Loop through the existing player list f rom the server for (int i = 0; i < ExistingPlayersMsg.players.Count; ++i) { //instantiate a cube for each entry GameObject ExistingPlayerCube = Instantiate(PlayerPrefab); //Set their id's in our list AllConnectedPlayers[ExistingPlayersMsg.players[i].id] = ExistingPlayerCube; //Set their position in our list as well. ExistingPlayerCube.transform.position = ExistingPlayersMsg.players[i].pos; } break; case Commands.ADDPLAYER: PlayerUpdateMsg newPlayerMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("new client info received!"); //Instantiate a new cube GameObject NewPlayerCube = Instantiate(PlayerPrefab); //Add it to our list AllConnectedPlayers[newPlayerMsg.player.id] = NewPlayerCube; //Make sure to tag it as not being us. NewPlayerCube.GetComponent <PlayerController>().IsClient = false; break; case Commands.PLAYERDROPPED: DisconnectedPlayersMsg DroppedMessage = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg); Debug.Log("Dropped Client"); //Loop through the list of dropped clients for (int i = 0; i < DroppedMessage.DROPPEDPLAYERLIST.Count; ++i) { //If any of our players contains the id in the dropped list from server if (AllConnectedPlayers.ContainsKey(DroppedMessage.DROPPEDPLAYERLIST[i])) { //Destroy that specific one on client. Destroy(AllConnectedPlayers[DroppedMessage.DROPPEDPLAYERLIST[i]]); //And Remove it from the our list on client. AllConnectedPlayers.Remove(DroppedMessage.DROPPEDPLAYERLIST[i]); } } break; default: Debug.Log("Unrecognized message received!"); break; } }