除了我在版本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="
任何帮助都会很棒。感谢。
答案 0 :(得分:2)
你没有发布的一件事是Environment.NewLine和HandshakeFinished等于。
标题必须符合RFC 2616.换句话说,每个标题行必须以CR + LF结尾(回车符+换行符或ASCII字符13后跟ASCII字符10)。除了表示标题行结尾的标题之外,最后一个标题后面必须跟一个额外的CR + LF。
此外,虽然由于您的客户端代码没有设置它,但它还没有引起您的问题,但您也缺少处理子协议选择的逻辑。如果客户端发送Sec-WebSocket-Protocol标头,则必须从其中一个子协议中进行选择,并将其返回到Sec-WebSocket-Protocol响应头中。