2012-01-17 125 views
2

我有同样的问题,在另一篇文章中被问到,除了我有版本13(RFS 6455)中的问题。有没有人成功地使用此版本实现Web套接字服务器?我尝试了所有我能找到的其他建议,但都没有成功。网络套接字服务器v13 RFC 6455客户端不接收消息

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

客户端是Chrome 16上的javascript。 服务器是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=" 

任何帮助将是巨大的。谢谢。

回答

2

你没有发布的一件事是什么Environment.NewLine和HandshakeFinished是相等的。换句话说,每个标题行必须以CR + LF(回车+换行或ASCII字符13后跟ASCII字符10)结尾。除了表示标题行结尾的标题之外,最后一个标题必须跟一个额外的CR + LF。

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

+0

感谢您的回复。 – Joy 2012-01-17 22:12:24

+0

这就是我所需要的。 Environment.NewLine是“\ r \ n”,但我在邮件的最后只有一个。我添加了第二个,我的客户端正在从服务器获取消息。如果我在使用WebSocket协议时遇到问题,我会再次发布。再次感谢! – Joy 2012-01-17 22:23:11

相关问题