コード例 #1
0
ファイル: TCPClient.cs プロジェクト: Lethme/GennadichGame
        public void SendFindLobbyMessage()
        {
            var clientData = new LobbyWaitData {
                ClientName = ClientName, Status = ReceiverStatus.Ok
            };
            var data = new DataReceiver(DataType.LobbyWait, clientData.ToString());

            SendMessage(data.ToString());
        }
コード例 #2
0
        private static void SendLobbyWaitMessage()
        {
            var players        = GetPlayersNamesList();
            var sendingMessage = new LobbyWaitData(_lobbyName, _clients.Count, players)
            {
                ClientName = _serverName
            };
            var sendingData = new DataReceiver(DataType.LobbyWait, sendingMessage.ToString());

            SendMessageToAll(sendingData.ToString());
        }
コード例 #3
0
        public static void SendLobbyRejectMessage(ConnectedObject client)
        {
            var clientData = new LobbyWaitData {
                ClientName = _serverName, Status = ReceiverStatus.Rejected
            };

            try
            {
                client.Socket.SendTo(Encoding.UTF8.GetBytes(clientData.ToString()), client.Socket.RemoteEndPoint);
            }
            catch (SocketException)
            {
                SendLobbyWaitMessage();
            }
            catch (ObjectDisposedException)
            {
                // ignored
            }
            catch (Exception)
            {
                SendLobbyWaitMessage();
            }
        }
コード例 #4
0
ファイル: TCPClient.cs プロジェクト: Lethme/GennadichGame
        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);
        }
コード例 #5
0
        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);
        }