Web Socket Server v13 RFC 6455客户端不接收消息

时间:2012-01-17 21:12:08

标签: c# javascript websocket

除了我在版本13(RFS 6455)中遇到问题之外,我在另一篇文章中提出了同样的问题。有没有人成功使用此版本实现Web套接字服务器?我已经尝试了所有其他可以找到的建议,但都没有。

相关文章: Websocket server: onopen function on the web socket is never called

客户端是Chrome 16上的javascript。 Server是一个C#控制台应用程序。

我的服务器能够接收客户端握手并成功发送响应,但客户端未触发onopen / onmessage事件。

似乎大多数人在线的问题都是握手信息本身,但我能找到的所有例子都是-75或-76版本。

我按照这里的说明操作: http://tools.ietf.org/html/rfc6455#page-39

这里我初始化服务器握手响应。

handshake = "HTTP/1.1 101 Switching Protocols" + Environment.NewLine;
handshake += "Upgrade: websocket" + Environment.NewLine;
handshake += "Connection: Upgrade" + Environment.NewLine;
handshake += "Sec-WebSocket-Accept: ";

这是我收到客户端握手消息,生成响应密钥并将其发回的地方。

System.Text.ASCIIEncoding decoder = new System.Text.ASCIIEncoding();
string clientHandshake = decoder.GetString(receivedDataBuffer, 0, receivedDataBuffer.Length);
string[] clientHandshakeLines = clientHandshake.Split(new string[] { Environment.NewLine }, System.StringSplitOptions.RemoveEmptyEntries);

foreach (string line in clientHandshakeLines)
{
    if (line.Contains("Sec-WebSocket-Key:"))
    {
        handshake += ComputeWebSocketHandshakeSecurityHash09(line.Substring(line.IndexOf(":") + 2));
        handshake += Environment.NewLine;     
    }
}

byte[] handshakeText = Encoding.ASCII.GetBytes(handshake);
byte[] serverHandshakeResponse = new byte[handshakeText.Length];
Array.Copy(handshakeText, serverHandshakeResponse, handshakeText.Length);

ConnectionSocket.BeginSend(serverHandshakeResponse, 0, serverHandshakeResponse.Length, 0, HandshakeFinished, null);

客户端代码如下所示。

ws = new WebSocket("ws://localhost:8181/test")
ws.onopen = WSonOpen;
ws.onmessage = WSonMessage;
ws.onclose = WSonClose;
ws.onerror = WSonError;

示例客户端握手

[0]: "GET /test HTTP/1.1"
[1]: "Upgrade: websocket"
[2]: "Connection: Upgrade"
[3]: "Host: localhost:8181"
[4]: "Origin: http://localhost:8080"
[5]: "Sec-WebSocket-Key: jKZrBlUEqqqstB+7wPES4A=="
[6]: "Sec-WebSocket-Version: 13"

示例服务器响应

[0]: "HTTP/1.1 101 Switching Protocols"
[1]: "Upgrade: websocket"
[2]: "Connection: Upgrade"
[3]: "Sec-WebSocket-Accept: mL2V6Yd+HNUHEKfUN6tf9s8EXjU="

任何帮助都会很棒。感谢。

1 个答案:

答案 0 :(得分:2)

你没有发布的一件事是Environment.NewLine和HandshakeFinished等于。

标题必须符合RFC 2616.换句话说,每个标题行必须以CR + LF结尾(回车符+换行符或ASCII字符13后跟ASCII字符10)。除了表示标题行结尾的标题之外,最后一个标题后面必须跟一个额外的CR + LF。

此外,虽然由于您的客户端代码没有设置它,但它还没有引起您的问题,但您也缺少处理子协议选择的逻辑。如果客户端发送Sec-WebSocket-Protocol标头,则必须从其中一个子协议中进行选择,并将其返回到Sec-WebSocket-Protocol响应头中。