2012-01-17 3 views
2

버전 13 (RFS 6455)에서 문제가 발생한다는 것을 제외하고는 다른 게시물에서 같은 질문을 받았습니다. 이 버전을 사용하여 웹 소켓 서버를 구현하는 데 성공한 사람이 있습니까? 내가 찾을 수있는 다른 모든 제안을 시도했지만 그 중 누구도 일하지 않았습니다.웹 소켓 서버 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가 동일한 것입니다.

헤더는 RFC 2616을 준수해야합니다. 즉, 각 헤더 행은 CR + LF (캐리지 리턴 + 줄 바꿈 또는 ASCII 문자 13, ASCII 문자 10)로 끝나야합니다. 마지막 헤더에는 헤더 행의 끝을 나타내는 CR + LF 외에 추가 CR + LF가 와야합니다.

또한 클라이언트 코드가 설정하지 않아서 문제가 발생하지는 않지만 하위 프로토콜 선택을 처리하는 논리가 누락되었습니다. 클라이언트가 Sec-WebSocket-Protocol 헤더를 보내는 경우 하위 프로토콜 중 하나에서 선택하고 Sec-WebSocket-Protocol 응답 헤더로 반환해야합니다.

+0

답장을 보내 주셔서 감사합니다. – Joy

+0

그게 내가 필요한거야. Environment.NewLine은 "\ r \ n"이지만 메시지 맨 끝에 하나만있었습니다. 나는 두번째 것을 추가했고 나의 클라이언트는 이제 서버로부터 메시지를 받고있다. WebSocket 프로토콜에 문제가 있으면 다시 게시하겠습니다. 다시 한 번 감사드립니다! – Joy

관련 문제