2011-10-26 2 views
3

Java 및 C++ 모두에서 WebSocket Server를 작성하려고하지만 현재 당황했습니다. java 및 java.net.ServerSocket/java.net.Socket을 사용하여 연결을 성공적으로 관리했지만 핸드 셰이크를 성공적으로 수행했지만 WebSocket에서 Java Server로 전송 한 데이터는 예상 한 것이 아닙니다.WebSocket 서버 작성

하는 것은 다음과 같은 자바 스크립트에서 메시지를 보낼 때 :

var count = 0; 
function loop(){ 
    websocket.send("loop: " + count + "\n"); 
    count++; 

    setTimeout(loop, 100); 
} 

자바 서버가이를 수신 라인은 호출 된 모든 websocket.send() 지금하고 있지만 모든를 공급한다.

? ‡ ½ ÷ "~Ñ~Mè ‡ ×? ‡ AI3-¡C {에서? ‡ OEI [UA ¢ 4 % ¶íi? ‡ $ ÍåøH ¢ 그런가? ‡ · † ÞžÛé ± î? |ê? ‡ '½Ø ... KÒ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â 5 : J FV %의 F6 키

자바 서버는 BufferedReader.readLine를 사용하여 소켓()에서 값을 검색

BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String line =socketReader.readLine(); 

이것은 악수 잘 작동하고 모든 핸드 쉐이크 데이터를 읽을 수 있지만,이 후 작동하지 않습니다 핸드 셰이크는

핸드 셰이크 이후의 데이터는 어떻게 든 암호화됩니까? 어떻게 읽을 수 있습니까?

편집 :

프로그램 파일 :

SocketConnectTest.html
ServerTest.java
ClientSessionTest.java
ResponseGenerator.java
output

그냥 S를 실행 erverTest.java를 열고 SocketConnectTest.html을 엽니 다.
ClientSessionTest.initClientListener()는 클라이언트의 메시지를 처리합니다.

해결

: 솔루션에 대한 는 pimvdbs 아래 게시 How to (de)construct data frames in WebSockets hybi 08+?

+0

서버에 텔넷을 사용해 볼 수 있습니까? 이렇게하면 일반 텍스트를 입력하고 전송되는 내용과 회신 메시지를 볼 수 있습니다 (HTTP 서버에서도이 작업을 수행 할 수 있습니다). –

+0

압축 될 수 있습니다. 'accept-encoding' 헤더는'gzip'을 포함합니까? 그렇다면 그것을 제거하고 다시 시도하십시오. – trojanfoe

+0

@trojanfoe 나는 gzip을 제거하려고 시도했고 또한 ID로 교체하려고 시도했다. 둘 다 도왔다. – Markus

답변

4

이 데이터는 웹 소켓을 통해 오는 그의 대답은 원료가 아닌 문자열 인코딩 된 데이터입니다 참조하십시오.

패킷이 0x00 바이트로 둘러싸 일 때 들어오는 데이터 주위에 BufferedReader를 래핑하지 않는 것이 좋습니다. 표시되는 미친 문자는 데이터가있는 인코딩을 Java가 이해하지 못해 발생한 결과입니다.

데이터를 문자 및 컨트롤 파트로 분할해야 할 책임이 있습니다. 데이터를 적절한 영역으로 분할하면 데이터를 문자열로 디코딩 할 수 있습니다.

+0

socket.getInputStream()으로 읽으려고했습니다.읽기 (버프); 지금. read()가 바이트 배열을 검색 할 때마다 처음 2 바이트는 -127과 -123입니다. 그러나 다음 바이트는 항상 동일한 메시지를 보내는 경우에도 임의로 표시됩니다. – Markus

+0

우리는 아마도 당신이 어떻게 보내고 있는지 그리고 그 메시지가 더 자세히 들어가는지를 볼 필요가있을 것입니다. 예를 들어, 보낼 때 데이터를 올바르게 래핑 있습니까? –

+0

초기 게시글에 출처를 추가했습니다. 메시지가 어떻게 든 감쌌다 고 생각합니까? 튜토리얼 나는 항상 send()를 사용하여 원시 문자열을 보았으므로 이것도 시작해서 일단 작업을 전송하면 자신의 응용 프로그램 프로토콜을 만들 것이라고 생각했습니다. – Markus