Exemplo n.º 1
0
        public async Task <int> GetPlayerCount(CancellationToken token)
        {
            using (var client = new TcpClient())
            {
                client.Connect(ServerAddress, Constants.DefaultPort);

                using (var stream = client.GetStream())
                {
                    var firstRequest = new FirstRequest()
                    {
                        RequestType = RequestType.PlayerCount,
                    };
                    var firstRequestJson = JsonConvert.SerializeObject(firstRequest);
                    Debug.Log($"firstRequestJson sent  '{firstRequestJson}'");
                    var firstRequestData = Encoding.UTF8.GetBytes(firstRequestJson);
                    stream.Write(firstRequestData, 0, firstRequestData.Length);

                    var payerCountRequest = new PlayerCountRequest()
                    {
                        RequestType = RequestType.PlayerCount,
                    };
                    var payerCountRequestJson = JsonConvert.SerializeObject(payerCountRequest);
                    var payerCountRequestData = Encoding.UTF8.GetBytes(payerCountRequestJson);
                    await stream.WriteAsync(payerCountRequestData, 0, payerCountRequestData.Length, token);

                    var  responseSize = Response.GetSize();
                    var  responseData = new byte[responseSize];
                    int  triesCount   = 0;
                    bool success      = false;
                    do
                    {
                        try
                        {
                            await Task.Delay(_timeBetweenTries, token);

                            stream.Read(responseData, 0, responseData.Length);
                            success = true;
                        }
                        catch (Exception ex)
                        {
                            Debug.Log(ex.ToString());
                            triesCount++;
                            success = false;
                        }
                        finally
                        {
                        }
                    }while (!success || triesCount > maxTries);

                    if (!success)
                    {
                        throw new IOException("cannot connect to server");
                    }

                    string responseJson = System.Text.Encoding.UTF8.GetString(responseData);
                    var    response     = JsonConvert.DeserializeObject <Response>(responseJson);

                    return(response.PlayerCount);
                }
            }
        }
Exemplo n.º 2
0
        private void ProcessServerLoop(TcpListener server, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                Debug.Log("Ожидание подключений... ");

                try
                {
                    using (TcpClient client = server.AcceptTcpClient())
                    {
                        Debug.Log("Подключен клиент. Выполнение запроса...");

                        using (NetworkStream stream = client.GetStream())
                        {
                            var firstRequestSize = FirstRequest.GetSize();
                            var buffer           = new byte[firstRequestSize];
                            Debug.Log($"firstRequestSize {firstRequestSize}");
                            stream.Read(buffer, 0, buffer.Length);
                            string result = System.Text.Encoding.UTF8.GetString(buffer);
                            Debug.Log($"firstRequest string '{result}'");
                            var firstRequest = JsonConvert.DeserializeObject <FirstRequest>(result);

                            var response = new Response();

                            switch (firstRequest.RequestType)
                            {
                            case RequestType.PlayerCount:

                                var playerCountRequestSize = PlayerCountRequest.GetSize();
                                buffer = new byte[playerCountRequestSize];

                                stream.Read(buffer, 0, buffer.Length);
                                result = System.Text.Encoding.UTF8.GetString(buffer);
                                var playerCountRequest = JsonConvert.DeserializeObject <PlayerCountRequest>(result);



                                response.PlayerCount = 4;
                                break;

                            default:
                                Debug.Assert(false);
                                Debug.Break();
                                break;
                            }

                            var responseJson = JsonConvert.SerializeObject(response);
                            var responseData = Encoding.UTF8.GetBytes(responseJson);
                            Debug.Log($"Отправлено сообщение: {responseData}");
                            stream.Write(responseData, 0, responseData.Length);

                            Debug.Log($"Отправлено сообщение: {responseData}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.Log($"exception on server: {ex}");
                    throw;
                }
                finally
                {
                    //TODO: check that does not block. I know it is not, but check
                    Thread.Sleep(1000);
                }
            }
        }