Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ClientWebSocket示例挂起_C#_Clientwebsocket - Fatal编程技术网

C# ClientWebSocket示例挂起

C# ClientWebSocket示例挂起,c#,clientwebsocket,C#,Clientwebsocket,以下页面上显示的示例不起作用: 它挂在以下行上: 等待ws.ConnectAsync(serverUri,CancellationToken.None) 似乎没有建立连接 请指出使以下代码工作的最简单修改。我不希望使用任何第三方工具或库 private static async Task DoClientWebSocket() { using (ClientWebSocket ws = new ClientWebSocket()) { Uri serverUri

以下页面上显示的示例不起作用:

它挂在以下行上:

等待ws.ConnectAsync(serverUri,CancellationToken.None)

似乎没有建立连接

请指出使以下代码工作的最简单修改。我不希望使用任何第三方工具或库

private static async Task DoClientWebSocket()
{
    using (ClientWebSocket ws = new ClientWebSocket())
    {
        Uri serverUri = new Uri("wss://echo.websocket.org/");
        await ws.ConnectAsync(serverUri, CancellationToken.None);
        while (ws.State == WebSocketState.Open)
        {
            string msg = "hello123";
            ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
            await ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None);
            ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]);
            WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None);
            Console.WriteLine(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));
        }
    }
}
private静态异步任务DoClientWebSocket()
{
使用(ClientWebSocket ws=new ClientWebSocket())
{
Uri serverUri=新Uri(“wss://echo.websocket.org/");
等待ws.ConnectAsync(serverUri,CancellationToken.None);
while(ws.State==WebSocketState.Open)
{
字符串msg=“hello123”;
ArraySegment bytesToSend=新的ArraySegment(Encoding.UTF8.GetBytes(msg));
等待ws.SendAsync(bytesToSend,WebSocketMessageType.Text,true,CancellationToken.None);
ArraySegment bytesReceived=新的ArraySegment(新字节[1024]);
WebSocketReceiveResult结果=等待ws.ReceiveAsync(bytesReceived,CancellationToken.None);
WriteLine(Encoding.UTF8.GetString(bytesReceived.Array,0,result.Count));
}
}
}

你是对的。使用
wss://echo.websocket.org/
。你的代码在我这边运行得很好。但是我建议对
ConnectAsync
sendaync
ReceiveAsync
调用进行一项改进,包括
timeout
,这样就不会长时间卡住

我将调用
SendAsync
的代码限制为仅调用5次,以便更容易验证输出

[编辑:][/strong>包括通过多次调用'ReceiveAsync'来接收完整响应的逻辑

private static async Task DoClientWebSocket()
{
    using (ClientWebSocket ws = new ClientWebSocket())
    {
        Uri serverUri = new Uri("wss://echo.websocket.org/");

        //Implementation of timeout of 5000 ms
        var source = new CancellationTokenSource();
        source.CancelAfter(5000);

        await ws.ConnectAsync(serverUri, source.Token);
        var iterationNo = 0;
        // restricted to 5 iteration only
        while (ws.State == WebSocketState.Open && iterationNo++ < 5)
        {
          string msg = "hello0123456789123456789123456789123456789123456789123456789";
          ArraySegment<byte> bytesToSend =
                      new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
          await ws.SendAsync(bytesToSend, WebSocketMessageType.Text,
                               true, source.Token);
          //Receive buffer
          var receiveBuffer = new byte[200];
          //Multipacket response
          var offset = 0;
          var dataPerPacket = 10; //Just for example
          while (true)
          {
              ArraySegment<byte> bytesReceived =
                        new ArraySegment<byte>(receiveBuffer, offset, dataPerPacket);
              WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived,
                                                            source.Token);
              //Partial data received
              Console.WriteLine("Data:{0}",
                               Encoding.UTF8.GetString(receiveBuffer, offset,
                                                            result.Count));
              offset += result.Count;
              if (result.EndOfMessage)
                    break;
            }
            Console.WriteLine("Complete response: {0}",
                                Encoding.UTF8.GetString(receiveBuffer, 0,
                                                            offset));
        }
    }
}


static void Main(string[] args)
{
    var taskWebConnect = Task.Run(() => DoClientWebSocket());

    taskWebConnect.Wait();
}

如果我转到并查看示例,URI是
ws://echo.websocket.org
,而不是
wss://echo.websocket.org/
。哦,我看到了两个URI。我尝试了ws:和wss:。这两种语言都是用javascript编写的,都不是用c语言编写的。你让它变得非常困难。c#中的默认请求头与其他应用程序不同。通常,要使代码正常工作,您必须添加缺少的标题或修改默认标题。解决这个问题的最佳方法是使用嗅探器将java或其他可用的应用程序与不工作的应用程序进行比较。将第一个请求与java和c#进行比较。javascript中未添加任何头:websocket=newWebSocket(wsUri);我必须在C#中添加哪些标题?@Tester很高兴知道。很乐意帮忙。您可以通过点击答题窗口左侧的“
勾选“
符号”来接受答案。现在我需要从另一个WebSocket中检索100k。当我将“ArraySegment(new byte)”的大小增加到1024000时,它仍然只能检索12K。您可以修改代码示例以检索1MB吗?@Tester您可以使用从
ReceiveAsync
接收的响应的
EndOfMessage
属性多次读取,直到所有数据都被读取。我将更新代码以解决此问题。
Data:hello01234
Data:5678912345
Data:6789123456
Data:7891234567
Data:8912345678
Data:9123456789
Complete response: hello0123456789123456789123456789123456789123456789123456789