2012-01-15 69 views
2

我試圖編寫自己的WebSocket服務器。解碼來自WebSocket與Java的「發送」消息

我知道有一些這方面的框架,但我想學習,所以我做我自己的:)目前與onOpen

我的JavaScript客戶端反應,所以我覺得握手是有效的, 連接建立。

現在的問題:

我的Java服務器使用一個線程選擇用於讀取的通道。

如果我在客戶端的WebSocket對象上做了*.send("test message"),我的服務器無法解碼字節數組。

我發現沒有關於使用的編碼/解碼技術的信息,所以我嘗試了很多版本來解碼。

例如:

new String(Base64.decodeBase64(buffer.array())) 

Charset set = Charset.forName("UTF-8"); 
new String(Base64.decodeBase64(set.decode(buffer).toString())) 

消息完全從通道到ByteBuffer的閱讀,所以我不認爲這是問題。

任何人都可以幫助我嗎?


好的這篇文章可以幫助我發送數據給客戶。這工作得很好:)
但我不明白如何從客戶端:(

接收到的數據進行解碼。在客戶端送我只有一個字母

socket.send("x"); 

服務器接收7字節? ??

ByteBuffer buffer = ByteBuffer.allocate(8192); 
int read = client.getInputStream().read(buffer2.array()); 
System.out.println("read: " + read); 

// read: 7 

for (int i = 0; i < read; i++) { 
    int j = buffer.get(i) & 0xff; 
    System.out.println("i: " + i + " => " + j + "=>" + new BigInteger(j + "").toString(2)); 
} 

//i: 0 => 129=>10000001 
//i: 1 => 129=>10000001 
//i: 2 => 195=>11000011 
//i: 3 => 235=>11101011 
//i: 4 => 4=>100 
//i: 5 => 96=>1100000 
//i: 6 => 187=>10111011 

如果我這樣做

secondByte AND 0111 1111 

(i:1)的結果是「1」,我認爲這意味着只有一個字節的數據。那麼爲什麼閱讀是7?

+2

查看http://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side/8125509#8125509解碼算法。 – pimvdb 2012-01-15 15:44:28

回答

1

至於你的第二個問題 - 從客戶端到服務器的數據總是蒙面,我也在上面的鏈接中解釋過。掩碼需要4個字節。

所以,實際數據的長度確實是1.只有第二個字節的最後7位說了一些關於長度的信息 - 第一位沒有,所以只是丟棄那個得到000 00011

的字節如在這種情況下,如下進行分類:

  • 0,1是間字節
  • 3,4,5,6是掩模
  • 7是數據

要獲取數據,請計算data XOR masks[data_index MOD 4],即187 XOR 195,即120 - x的字符代碼。

+0

現在運行了:)感謝! – user1150445 2012-01-18 18:10:46

+0

@ user1150445:如果能解決您的問題,請您接受答案嗎?謝謝! – pimvdb 2012-01-18 19:30:25

相關問題