2012-09-06 3 views
1

similar question을 읽었지만 문제가 해결되지 않았습니다.Java WebSocket 서버 OutputStream 플러시되지 않음

저는 배우기 위해 제 자신의 Java WebSocket 서버를 구축하려고합니다. 서버가 잘 설정되고 들어오는 연결을 받아들이고 클라이언트에서 핸드 셰이크 데이터를 가져옵니다. 내 서버는 핸드 셰이크 반환 데이터를 계산하고이를 쓰고 플러시를 시도합니다. 그럼에도 불구하고 웹 검사기에서는 클라이언트에 대한 응답 헤더가 표시되지 않으며 onopen -JavaScript 이벤트는 절대로 실행되지 않습니다. 한다고

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: Z2Vy9p7Lp+MZPdZOe+L5GhVBDpc= 

을 내가 보낼 헤더를 보내고 있습니다 싶습니다

GET/HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:65432 
Origin: http://localhost 
Sec-WebSocket-Key: ph1CO1PCF60uojeP+nql5A== 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 

그리고 제가 보내려고 : 그래서 여기

String EOL = System.getProperty("line.separator"); // actually a class-defined constant 

BufferedReader inputStream = currentClient.getInputStream(); 
OutputStream outputStream = currentClient.getOutputStream(); 

String inputLine; 
String handshake = ""; 

try { 

    if(!inputStream.ready()){ continue; } 

    System.out.println("Receiving:\n"); 

    while ((inputLine = inputStream.readLine()).length() > 0) { 

     if(inputLine.startsWith("Sec-WebSocket-Key: ")){ 

      String inputKey = inputLine.replace("Sec-WebSocket-Key: ", ""); 
      String outputKey = WebSocket.getWebSocketKey(inputKey); 

      handshake += "HTTP/1.1 101 Switching Protocols"+EOL; 
      handshake += "Upgrade: websocket"+EOL; 
      handshake += "Connection: Upgrade"+EOL; 
      handshake += "Sec-WebSocket-Accept: "+outputKey; 

     } 

     System.out.println(inputLine); 

    } 

} catch (Exception e) { 

    e.printStackTrace(); 

} 

System.out.println("\n\nSending:\n"); 

System.out.println(handshake); 
try { 
    outputStream.write(handshake.getBytes(Charset.forName("UTF-8"))); 
    outputStream.flush(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

는 내가 무엇을 얻을의 예입니다 내가 개발 한 PHP WebSocket 서버에서 이러한 헤더를 보내지 않아도된다.

+0

줄 끝은 "\ r \ n"이어야합니다. EOL은 이것에 대한 모호한 버전입니까? 또한 응답을 "\ r \ n \ r \ n"으로 끝내시겠습니까? 이것은 귀하의 코드에 표시되지 않습니다. WebSocket.getWebSocketKey()를 작성 했습니까? 그랬다면 코드를 올리시겠습니까? – simonc

+0

또한 EOL에 "\ r \ n"을 사용해 보았습니다. 그것은 내 코드 단편의 첫 번째 줄에 정의되어 있습니다. – arik

+1

EOL *은 "\ r \ n"이어야합니다. Sec-WebSocket-Accept 헤더 다음에 이것을 변경하고 "\ r \ n \ r \ n"을 추가 할 수 있습니까? – simonc

답변

3

websocket 핸드 셰이크는 HTTP 요청 다음에 HTTP 응답입니다. RFC2616은 HTTP의 줄 끝 표식기가 CRLF ("\ r \ n")임을 나타냅니다.

HTTP 요청은 이중 개행 (​​"\ r \ n \ r \ n"- RFC의 4 절 참조)로 끝납니다. websocket 핸드 셰이크 응답은 HTTP 응답이므로 이렇게 끝내야합니다.

관련 문제