2011-11-11 4 views
2

간단한 웹 소켓 서버와 클라이언트를 구현하려고합니다. 이 질문을하는 것이 분명한 경우 미안합니다.클라이언트 - 서버 WebSocket 핸드 셰이크

09 (버전 8) 프로토콜을 사용한다고 생각하는 Chrome v15를 사용하고 있습니까?

나는 그 (것)들을 연결할 수있는 것처럼 보이지 않는다. 내가 브라우저에서 받고 있어요 요청은 다음과 같습니다 나는 Sec-WebSocket-Protocol 헤더가없는 것으로 나타났습니다

GET /chat HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:8181 
Sec-WebSocket-Origin: http://localhost:51990 
Sec-WebSocket-Key: JFAw5PLk45TodN2ERD1ePA== 
Sec-WebSocket-Version: 8 
Cookie: size=4; CP.mode=B; ASP.NET_SessionId=zzx3d3ajepwwycqjaj1nyex4; .ASPXAUTH=781D3791DC2483756B3DA9FA8E031A9BACD357EBD8FA23B7BCB8BDA6526F28F77FC798A0D4BEC4E2B166700B5C08FA60CBF588D292BFC1D050C9B034522C93ACBEF28BC6D51FDC5B40F6050F03758DA1A3E4D3F7484BC4F7DA3602A5FAFD3023C8D4D5929B69F88DB417CA6F366A83F334807818E2C07E23C0D0993F25B3C9BDE02A; name=Test 

.

이 같은 모습을 보내고있다 응답 : 내가 잘못 뭘하는지

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: VAuGgaNDB/reVQpGfDF8KXeZx5o= 
Sec-WebSocket-Protocol: chat 

사람이에 대한 몇 가지 빛을하시기 바랍니다 있나

?

편집 : 나는 키를 받아 생성하기 위해 사용하고 코드는 다음과 같습니다

public static String ComputeWebSocketHandshakeSecurityHash09(String secWebSocketKey) 
     { 
      const String MagicKEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 
      String secWebSocketAccept = String.Empty; 

      // 1. Combine the request Sec-WebSocket-Key with magic key. 
      String ret = secWebSocketKey + MagicKEY; 

      // 2. Compute the SHA1 hash 
      SHA1 sha = new SHA1CryptoServiceProvider(); 
      byte[] sha1Hash = sha.ComputeHash(Encoding.UTF8.GetBytes(ret)); 

      // 3. Base64 encode the hash 
      secWebSocketAccept = Convert.ToBase64String(sha1Hash); 

      return secWebSocketAccept; 
     } 

편집 :이 응답 코드 :

 StringBuilder mResponse = new StringBuilder(); 
     mResponse.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine); 
     mResponse.Append("Upgrade: WebSocket" + Environment.NewLine); 
     mResponse.Append("Connection: Upgrade" + Environment.NewLine); 
     mResponse.Append(String.Format("Sec-WebSocket-Accept: {0}", ComputeWebSocketHandshakeSecurityHash09(secKey)) + Environment.NewLine); 


     // Build the response for the client 
     byte[] HandshakeText = Encoding.UTF8.GetBytes(mResponse.ToString()); 

     logger.Log(""); 
     logger.Log("Sending handshake ..."); 

     ConnectionSocket.BeginSend(HandshakeText, 0, HandshakeText.Length, 0, HandshakeFinished, null); 
+0

동의하지 않는 한 동의 키가 잘못된 것으로 보입니다. 입력에 따라'tixAAehY4D7GQBBUYkVMLZ3yccE ='이어야합니다. 너는 어떻게 계산하고 있니? (그 코드를 게시 할 수 있겠습니까?) – pimvdb

+0

좋습니다. 알아 냈습니다. 이 버전에서는 'Sec-WebSocket-Protocol : chat'이 필요하지 않았습니다. 이제 연결하지만 onclose 메서드는 open이 아닌 clientside 메서드 만 호출합니다. 어떤 아이디어? – RexMundi

+0

응답이 어떤 식 으로든 올바르지 않은 경우에 발생합니다. 두 개의 'CRLF'를 추가했는지 확인 했습니까? – pimvdb

답변

0

내가 연결을 관리하지만, 메시지를 보낼 때 디코딩 할 수 없습니다. 잠시만 기다려주십시오. this question.

관련 문제