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); } } }
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); } } }