如何修复异步请求和对WebSocket的响应

时间:2019-02-18 10:32:34

标签: c# websocket async-await console task-parallel-library

以下是我用来与Websocket通信的一段代码。

Webscoket使用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

0 个答案:

没有答案