我正在尝试在C#中实现WebSocket客户端。我创建了一个名为WSConnection的类,它创建WebSocketClient对象并通过ConnectAsync()方法将其连接到服务器。握手似乎有效,因为套接字状态在它之后被设置为"打开"。
当我尝试将第一个请求发送到服务器时,问题就出现了(我需要发送一个特定的连接请求来验证连接并对自己进行身份验证)。当我尝试这样做时,程序仍然停留在Receive()方法的ReceiveAsync()行上,这意味着,如果我理解的话,没有从服务器收到任何消息。
以下是WSConnection类的代码:
class WSConnection
{
private const string url = "ws://...";
private string authenticationKey;
private ClientWebSocket ws;
public WSConnection(string key)
{
this.authenticationKey = key;
this.ws = new ClientWebSocket();
}
public async Task Connect()
{
while(ws.State != WebSocketState.Open)
{
await ws.ConnectAsync(new Uri(url), CancellationToken.None);
Console.WriteLine("Web socket : " + ws.State);
Console.WriteLine("Sending connect request...");
// Send the connect request and wait for the response
await Send("connect");
await Receive();
}
}
public async Task Send(string type)
{
StringBuilder message = new StringBuilder();
// We send a connect request
if (type == "connect")
{
message.Append("type=" + HttpUtility.UrlEncode("authentication") + "&");
message.Append("authenticationKey=" + HttpUtility.UrlEncode(authenticationKey));
}
else
{
Console.WriteLine("No valid message type");
return;
}
Console.WriteLine("Send message : " + message.ToString());
var sendBuffer = new ArraySegment<Byte>(Encoding.UTF8.GetBytes(message.ToString()));
await ws.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
public async Task Receive()
{
ArraySegment<byte> receivedBytes = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await ws.ReceiveAsync(receivedBytes, CancellationToken.None);
Console.WriteLine(Encoding.UTF8.GetString(receivedBytes.Array, 0, result.Count));
}
}
之后,我只需在main中调用一个等待的Connect()方法。
我认为我没有收到服务器发来的任何消息,因为我没有发送正确的消息,所以问题是如何更改我发送的消息?
先谢谢你。
修改
正如胡安所说,我用Fiddler来看框架,我得到了2个相应的框架:
同样,我无法提供我想要覆盖的网址,因此我将其与其他网址联系起来,但是对于我正在寻找的内容,主机还可以。