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