2012-01-17 13 views
2

バージョン13(RFS 6455)で問題が発生している点を除いて、別の投稿で同じ質問が表示されます。誰もこのバージョンを使用してWebソケットサーバーを実装することに成功しましたか?私は見つけることができる他のすべての提案を試みましたが、どれも働いていませんでした。ウェブソケットサーバv13 RFC 6455クライアントがメッセージを受信しない

関連のポスト: Websocket server: onopen function on the web socket is never called

クライアントは、クロム16 サーバー上のJavaScriptでC#のコンソールアプリケーションです。

私のサーバーは、クライアントのハンドシェイクを受信し、正常応答を送信することができますが、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が等しいものです。

ヘッダはRFC 2616に準拠している必要があります。つまり、各ヘッダ行はCR + LF(改行+改行またはASCII文字13の後にASCII文字10)で終わる必要があります。最後のヘッダーには、ヘッダー行の終わりを示すものに加えて、CR + LFが続く必要があります。クライアントコードが設定されていないので、それはまだあなたの問題を引き起こしていないものの

はまた、あなたはまた、サブプロトコルの選択を処理するためのロジックが欠落しています。クライアントがSec-WebSocket-Protocolヘッダーを送信する場合は、サブプロトコルの1つから選択し、Sec-WebSocket-Protocol応答ヘッダーで返す必要があります。

+0

返信いただきありがとうございます。 – Joy

+0

それは私が必要としたものです。 Environment.NewLineは "\ r \ n"ですが、メッセージの最後には1つしかありませんでした。私は2番目を追加し、私のクライアントは今、サーバーからメッセージを取得しています。 WebSocketプロトコルに問題がある場合は、私は再び投稿します。再度、感謝します! – Joy

関連する問題