2014-11-30 4 views
0

여기 배경은 클라이언트의 javascript에 연결하기 위해 부두 웹 소켓 서버를 사용하고 있습니다. 서버에는 ByteBuffer을 보낼 수있는 소켓 끝 점이 있습니다.ByteBuffer.wrap (buffer.array())의 부작용

이상한 점은 배열 bytes[]을 작성하고 ByteBuffer.wrap(byteArray)을 보내면 작동한다는 것입니다.

ByteBuffer.allocatebuffer.put(..)을 사용하여 ByteBuffer을 빌드 한 다음 동일한 방식으로 보내면 클라이언트는 길이가 0 인 메시지를 수신합니다.

키커는 내가 바이트 버퍼를 만들고 전송하기 전에 ByteBuffer.wrap(buffer.array())을 보내면 모든 것이 완벽하게 작동한다는 것입니다!

그래서 jetty websocket 서버에서 무슨 일이 일어나든지 상관없이, 바이트를 랩핑 해제하고 랩핑 할 때 부작용이 있음을 분명히 알 수 있습니다. I 생각은입니다. 모두 같은 데이터를 메모리에 두었 기 때문에 나는 그렇지 않습니다. 생각하면 비용이 많이 들지만, 느낌이 suuuper hacky이고, 여기에 무슨 일이 일어나고 있는지 알고 싶습니다. !

감사합니다.

편집 : FWIW, endianness-both endiannesses (?)는 ByteBuffer.wrap(buffer.array())과 작동하며 다른 방법으로는 작동하지 않습니다.

+1

버퍼를 보내기 전에 버퍼를 '넘기는'또는 '되감기'합니까? – Alex

+0

나는 없었다. 고맙습니다! (질문을 답안으로 다시 말하면 받아 들일 것입니다.) – Nick

답변

1

put 메쏘드 (인덱스를 제외하고)는 호출 될 때 위치를 증가시키기 때문에 버퍼를 전송하기 전에 버퍼의 위치를 ​​재설정해야하며, 부두는 분명히 무엇을 보내야할지 결정합니다.

당신은 버퍼의 제한을 변경하지 않거나 position와 마크를 폐기되는 이전 위치로 제한을 0으로 위치를 설정 마크를 삭제하고, 설정 flip, 또는 rewind하여이 작업을 수행 할 수

새로운 위치보다 큰 경우 전달하고 한계를 변경하지 않습니다.

wrap(byte[])은 위치를 0으로 설정하고 전달하는 배열의 길이를 제한하기 때문에 작동합니다.