2012-01-17 165 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

相關問題