private bool Receive() { int bytesRead; try { bytesRead = Client.Socket.Receive(Client.Buffer, SocketFlags.None); } catch (SocketException) { Client.Close(); return(false); } catch (ObjectDisposedException) { return(false); } if (bytesRead == 0) { return(true); } var receiverData = DataReceiver.Create(Client.Buffer, bytesRead); switch (receiverData.DataType) { case DataType.LobbyWait: { var lobbyData = LobbyWaitData.Create(receiverData.MessageData); switch (lobbyData.Status) { case ReceiverStatus.Ok: { if (LobbyName == null) { LobbyName = lobbyData.LobbyName; } handleConnection(lobbyData.CurrentPlayers); break; } case ReceiverStatus.Rejected: { break; } default: throw new ArgumentOutOfRangeException(); } break; } case DataType.Game: ReceiverGameData = GameData.Create(receiverData.MessageData); switch (ReceiverGameData.Status) { case ReceiverStatus.Ok: { if (ReceiverGameData.NumStep == 0 && ReceiverGameData.TurnPlayerNumShoot == 0) { handleGame(); } handleViewData(ReceiverGameData); break; } case ReceiverStatus.Rejected: { break; } default: throw new ArgumentOutOfRangeException(); } break; default: throw new ArgumentOutOfRangeException(); } return(true); }
private static void ReceiveCallback(IAsyncResult ar) { int bytesRead; if (!CheckState(ar, out var err, out var client)) { Console.WriteLine(err); return; } try { bytesRead = client.Socket.EndReceive(ar); } catch (SocketException) { CloseClient(client); SendLobbyWaitMessage(); return; } catch (ObjectDisposedException) { return; } if (bytesRead > 0) { var receiverData = DataReceiver.Create(client.Buffer, bytesRead); switch (receiverData.DataType) { case DataType.LobbyWait: { var lobbyData = LobbyWaitData.Create(receiverData.MessageData); if (lobbyData.LobbyName == null) { if (_clients.Count < MaxPlayers) { client.Name = lobbyData.ClientName; _clients.Add(client); SendLobbyWaitMessage(); } else { SendLobbyRejectMessage(client); } } break; } case DataType.Game: { _gameData = GameData.Create(receiverData.MessageData); if (_gameData.TurnPlayerNumShoot == 2) { SendGameDataMessage(); Thread.Sleep(2000); _gameData.TurnPlayerNumShoot = 0; var playerScore = 0; foreach (var shoot in _gameData.Shoots) { playerScore += shoot.ShootScore; } if (_gameData.TableScore.CheckOverGoal(_gameData.TurnPlayerName, playerScore)) { _gameData.TableScore.SetPlayerScoreInStep(_gameData.TurnPlayerName, playerScore); } _gameData.Shoots.Clear(); if (_gameData.TableScore.WinScoreCheck(_gameData.TurnPlayerName)) { _gameData.WinPlayer = _gameData.TurnPlayerName; } var players = GetPlayersNamesList(); if (_gameData.TurnPlayerName == players.Last()) { _gameData.TurnPlayerName = players.First(); _gameData.NumStep++; } else { _gameData.TurnPlayerName = players[players.IndexOf(_gameData.TurnPlayerName) + 1]; } } else { _gameData.TurnPlayerNumShoot++; } SendGameDataMessage(); break; } default: throw new ArgumentOutOfRangeException(); } } Receive(client); }