2013-05-25 31 views
2

我想用一個在python中創建的服務器和java中的客戶端來製作一個非常簡單的聊天程序。不過,我不知道如何解碼服務器從客戶端接收的數據。客戶端發送並編碼爲UTF-8。我如何解碼來自TCP套接字的數據

只是打印,它看起來是這樣的:從http://i.imgur.com/0usK6j7.jpg

和解碼UTF-8首先它看起來是這樣的:http://i.imgur.com/Ctwivl4.jpg

我假定NULL字符或\ X00可以被刪除。對於包裝整個消息的b''也是如此。第二個字符似乎指定了消息的長度。但我該如何解碼?我應該手動刪除字符嗎?我知道這是一個很基本的問題,可能以前有人問過,但我甚至不知道要搜索什麼。

+2

你使用什麼聊天協議? – ejno

+0

我不確定你的意思。我通過TCP連接發送UTF-8編碼的消息。還有什麼我正在做或應該知道的? – Latedi

+2

爲了迴應@ejno所說的話,它看起來像是在使用某種結構化的二進制數據編碼,而不是簡單的UTF-8文本。從您提供的樣本中,可以看到至少一些以16位長度開頭的文本字符串。一般來說,要「解碼來自TCP套接字的數據」(或從其他任何地方解碼數據),您需要遵循您期望數據所處的任何格式的規範。 – Celada

回答

2

在java客戶端,我有一個DataOutputStream對象,我用這個方法:out.writeUTF(input);

根據documentation of that method,它不會將UTF-8寫入輸出流。它說「首先,兩個字節被寫入輸出流」,這解釋了在字符串之前的16位長度。甚至在它不寫UTF-8之後,它會用Java自己的特殊編碼來編寫它,它稱之爲Modified UTF-8,而其實際變體是CESU-8,而不是UTF-8。

因此,首先,您需要明確您希望使用什麼格式在客戶端和服務器之間進行通信:協議。它是普通的UTF-8嗎? writeUTF發出奇怪的結構化編碼嗎?還有別的嗎?然後寫下您的客戶端和服務器以遵循該規範。