private void HandleClientMessageWithNoMicrophone(IPEndPoint clientIpEndPoint, ConnectRequestDto connectRequestDto)
    {
        ConnectResponseDto connectResponseDto = new ConnectResponseDto
        {
            ClientName     = connectRequestDto.ClientName,
            ClientId       = connectRequestDto.ClientId,
            HttpServerPort = httpServer.port,
        };

        serverUdpClient.Send(connectResponseDto.ToJson(), clientIpEndPoint);
    }
    private void HandleClientMessageWithMicrophone(IPEndPoint clientIpEndPoint, ConnectRequestDto connectRequestDto)
    {
        ConnectedClientHandler newConnectedClientHandler = RegisterClient(clientIpEndPoint, connectRequestDto.ClientName, connectRequestDto.ClientId, connectRequestDto.MicrophoneSampleRate);

        clientConnectedEventQueue.Enqueue(new ClientConnectionEvent(newConnectedClientHandler, true));

        ConnectResponseDto connectResponseDto = new ConnectResponseDto
        {
            ClientName     = connectRequestDto.ClientName,
            ClientId       = connectRequestDto.ClientId,
            HttpServerPort = httpServer.port,
            MicrophonePort = newConnectedClientHandler.MicTcpListener.GetPort(),
        };

        Debug.Log("Sending ConnectResponse to " + clientIpEndPoint.Address + ":" + clientIpEndPoint.Port);
        serverUdpClient.Send(connectResponseDto.ToJson(), clientIpEndPoint);
    }
    private void HandleServerMessage(IPEndPoint serverIpEndPoint, string message)
    {
        Debug.Log($"Received message from server {serverIpEndPoint} ({serverIpEndPoint.Address}): '{message}'");
        try
        {
            ConnectResponseDto connectResponseDto = JsonConverter.FromJson <ConnectResponseDto>(message);
            if (!connectResponseDto.ErrorMessage.IsNullOrEmpty())
            {
                throw new ConnectRequestException("Server returned error message: " + connectResponseDto.ErrorMessage);
            }
            if (connectResponseDto.ClientName.IsNullOrEmpty())
            {
                throw new ConnectRequestException("Malformed ConnectResponse: missing ClientName.");
            }
            if (connectResponseDto.ClientId.IsNullOrEmpty())
            {
                throw new ConnectRequestException("Malformed ConnectResponse: missing ClientId.");
            }
            if (!string.Equals(connectResponseDto.ClientId, settings.ClientId, StringComparison.InvariantCulture))
            {
                throw new ConnectRequestException($"Malformed ConnectResponse: wrong ClientId. Is {connectResponseDto.ClientId}, expected {settings.ClientId}");
            }
            if (connectResponseDto.MicrophonePort <= 0)
            {
                throw new ConnectRequestException("Malformed ConnectResponse: invalid MicrophonePort.");
            }

            connectResponseDto.ServerIpEndPoint = serverIpEndPoint;
            serverResponseQueue.Enqueue(connectResponseDto);
        }
        catch (Exception e)
        {
            serverResponseQueue.Enqueue(new ConnectResponseDto
            {
                ErrorMessage = e.Message
            });
        }
    }