Как исправить асинхронный запрос и ответ на веб-сокет - PullRequest
0 голосов
/ 18 февраля 2019

Ниже приведен фрагмент кода, который я использую для связи с веб-сокетом.

В вебскокете используется тип протокола XML для связи.

Я пытаюсь отправить серию запросов и жду ответа.

Вот следующий код:

static void Main(string[] args)
        {
        Thread.Sleep(1000);

        Uri myUri = new Uri("ws://127.0.0.1:4848", UriKind.Absolute);
        Connect(myUri).Wait();
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }

    public static async Task Connect(Uri uri)
    {
        ClientWebSocket webSocket = null;

        try
        {
            webSocket = new ClientWebSocket();
            await webSocket.ConnectAsync(uri, CancellationToken.None);

            byte[] buffer;
            byte[] receiveBuffer = new byte[receiveChunkSize];

            string[] requestStrings =
            {
                "request1",
                "request2",
                "request3"
            };


            foreach (var request in requestStrings)
            {
                buffer = encoder.GetBytes(request);

                Task sendRequest = Send(webSocket, buffer);
                await sendRequest;

                Task receiveResponse = Receive(webSocket);
                await receiveResponse;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex);
        }
    }
    static UTF8Encoding encoder = new UTF8Encoding();

    private static async Task Send(ClientWebSocket webSocket, byte[] buffer)
    {
        await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
        LogStatus(false, buffer, buffer.Length);
    }

    private static async Task Receive(ClientWebSocket webSocket)
    {
        byte[] buffer = new byte[receiveChunkSize];
        var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            LogStatus(true, buffer, result.Count);            
    }

    private static void LogStatus(bool receiving, byte[] buffer, int length)
    {
        lock (consoleLock)
        {
            Console.ForegroundColor = receiving ? ConsoleColor.Green : ConsoleColor.Gray;

            if (verbose)
                Console.WriteLine(encoder.GetString(buffer));
            Console.ResetColor();
        }
    }
}

Я не получаю ответов от веб-сокета.Я не уверен в том, что я делаю здесь неправильно.Вывод выглядит следующим образом:

Output:
request1
request2
request3
...