【问题标题】:ReceiveAsync not receiving websocket messages in C#ReceiveAsync 未在 C# 中接收 websocket 消息
【发布时间】:2022-11-10 19:38:48
【问题描述】:

在我向服务器发送一些消息后,我想从websocket 接收消息。我在 Nodejs 中创建了虚拟 websocket 服务器,通过它我可以从服务器接收消息,但是当我尝试使用客户端的 websocket 时,它不起作用。

请注意:我能够连接到客户端的 websocket。

以下是我用过connectsendreceive 的方法

Connect 方法

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

    try
    {
        webSocket = new ClientWebSocket();
        webSocket.Options.SetRequestHeader("x-session-token", "efcb0a89db75d4faa147035461224182");
        await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
      
        await Task.WhenAll(Send(webSocket), Receive(webSocket));
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception: {0}", ex);
    }
    finally
    {
        if (webSocket != null)
            webSocket.Dispose();
        Console.WriteLine();

        lock (consoleLock)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("WebSocket closed.");
            Console.ResetColor();
        }
    }
}

对于发送,我想将 JSON 数据发送到服务器,以便它会相应地返回结果。下面是Send 方法

private static async Task Send(ClientWebSocket webSocket)
{
    while (webSocket.State == WebSocketState.Open)
    {
        

        Symbol[] sym =
        {                    
             new Symbol
             {
                 symbol = "1330_NSE"
             }
        };               

        RequestBody requestBody = new RequestBody()
        {
            request = new Request
            {
                streaming_type = "quote",

                data = new Data()
                {
                    symbols = sym
                },
                request_type = "subscribe",
                response_format = "json"
            }
        };

        var json = JsonConvert.SerializeObject(requestBody);

        var sendBuffer = new ArraySegment<Byte>(Encoding.UTF8.GetBytes(json));
            
        await webSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);

        await Task.Delay(delay);
    }
}

下面是receive 方法

private static async Task Receive(ClientWebSocket webSocket)
{
    byte[] buffer = new byte[receiveChunkSize];
    while (webSocket.State == WebSocketState.Open)
    {
        var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        if (result.MessageType == WebSocketMessageType.Close)
        {
            await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
        }
        else
        {
            string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine(message);
        }
    }
}

当我尝试运行它时,它会出现 websocket.ReceiveAsync 函数并且在它之后什么也不做

var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

我想,它不是在等待从服务器接收消息吗?

另外我想知道是否有任何方法可以确认我从send 方法发送的消息是否发送到服务器?

【问题讨论】:

    标签: c# websocket


    【解决方案1】:

    WebSocket.SendAsync 完成之前,不得调用WebSocket.ReceiveAsync。问题在这里:

    await Task.WhenAll(Send(webSocket), Receive(webSocket));
    

    因为是async,所以不保证执行顺序。

    尝试更改为:

    await Send(webSocket);
    await Receive(webSocket);
    

    现在Send 必须在调用Receive 之前完成(没有错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多