使用C#中的WebSocket客户端发送消息并接收答案

时间:2017-05-22 12:58:34

标签: c# websocket client

我正在尝试在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个相应的框架:

First frame

Second frame

同样,我无法提供我想要覆盖的网址,因此我将其与其他网址联系起来,但是对于我正在寻找的内容,主机还可以。

0 个答案:

没有答案