2011-10-26 5 views
1

초안의 마지막 버전 용 Java 서버를 만들고 있습니다. 나는 그럭저럭 그 관계를 만들 수 있었다. 그리고 그것은 위대하게 일하고있다.WebSocket Server in Java (hybi 10) 송수신

문제는 데이터가 어떻게 인코딩되는지 이해할 수 없다는 것입니다. 문제는 어떻게 수행해야하는지 예제를 찾으려고했지만 아무 것도 찾을 수 없었습니다. 그래서 나는 혼자 힘으로 노력하고 있지만 도움이 필요합니다.

Here은 프레임의 이미지입니다.

하지만 페이로드가 시작되는 위치를 이해할 수 없습니다. 무엇인가

확장 된 페이로드 길이 (63분의 16) (경우 페이로드 렌의 == 127분의 126) 내 페이로드가 있어야하는 장소

은? 당신이 볼 수 있기 때문에

사람은 만 127에 숫자 0을 표현할 수있다 (문제는 길이가 7 비트에 항상 적합하지 않는다는 것입니다 ... 나는 완전히 잃었어요,

답변

2

일부 도움을 줄 수 그리고 그 경우에 어느 다음 2 또는 8 바이트 길이 적합하게 사용된다) 7 비트 :

  • 수단 (126)은 다음 2 바이트 길이에 사용
  • 127 8 다음 수단 바이트는 길이로 사용됩니다.

페이로드는 인코딩되지 않은 경우 색인 2, 4 또는 10에서 시작합니다. 인코딩 될 때, 그것은 6, 8 또는 14에서 시작합니다 (4 개의 마스크 바이트가 있기 때문에).

이전에 페이로드 데이터 디코딩에 대해 some pseudocode을 게시했습니다.


실제로 "실수"(길이 두 바이트가있는 경우) 다음과 같이 (대신 별도의 바이트), 당신은 비트 시프트 연산자를 사용할 수 있습니다로 길이를 효율적으로 활용하려면 다음

var length = (bytes[2] << 8) | (bytes[3] << 0); 

이이처럼 계산합니다 :

가정합니다

  • bytes[2]가,532입니다
  • bytes[3] (베이스 (10)에 105) (10) 일 것이다 그런 <<

(베이스 (10)에 165) 10100101이다

01101001 00000000 // moved 8 places to the left, filled with zeroes 
     10100101 // moved 0 places (nothing really happening, you can eliminate '<< 0') 

| 것은 기본적에 추가된다

01101001 00000000 
     10100101 
----------------- | 
01101001 10100101  (in base 10 that's 27045) 

따라서 바이트가있는 경우 105165 인 경우 길이는 27045입니다.

+0

위대한 링크, 다른 질문, 얼마나 많은 바이트를 읽을 지 어떻게 알 수 있습니까 ?? 왜냐하면 나는 websocket의 "프레임"의 크기를 알지 못하기 때문에 java에서 "dataInputStream.read (bytes, totalToRead, leftToRead) ...를 사용하여 읽고 있습니다. 어떤 아이디어가 완전히 손실되었습니다 ... 감사합니다. – Andres

+0

@Andres : Java는 모르지만 프레임에 길이가 포함되어 있다고 말했고 세 가지 경우에 나는 두 번째 바이트 (마지막 7 비트), 세 번째 바이트 네 번째 바이트 또는 세 번째에서 네 번째 바이트까지 – pimvdb

+0

@Andres : 바이트를 해석하고 길이로 변환하는 방법을 모르는 경우 제 편집을보십시오. – pimvdb