2012-08-08 70 views
0

我使用一個Java套接字程序從服務器寫入整數和字符返回給客戶端Java Socket技術作家

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 

我想寫一個Int32和8B的絲炭。對於整數當我寫

out.printf("%04x",1); 
它Wireshark的顯示爲 「30 30 30 31」

,而我希望它出現 「01 00 00 00」。對於out.printf(「%d」,1);它顯示爲「31」,而我想要它「01 00 00 00」。我如何在電線上寫上4B的整數和8B的字符?表示與編碼有關嗎?

+0

你想要小端或大端格式嗎? – 2012-08-08 13:15:04

+0

你正在寫它作爲一個字符串。 0是字符30,1是字符31.對於順序,字節序進入遊戲。 – CodeCaster 2012-08-08 14:44:13

回答

2

使用PrintWrite將文本寫入套接字並不理想,因爲它會隱藏任何錯誤。

在你的情況下,你似乎想寫二進制文件,所以我建議你試試。

DataOutputStream out = new DataOutputStream(
         new BufferedOutputStream(clientSocket.getOutputStream())); 

out.writeInt(1); 

但是,如果你想起訴小端格式,我會使用阻塞NIO。

SocketChannel sc = 
ByteBuffer bb= ByteBuffer.allocateDirect(1024).order(ByteOrder.LITTLE_ENDIAN); 

bb.putInt(1); 
// put whatever else 
bb.flip(); 
while(bb.remaining() > 0) sc.write(bb); 
+0

我明白DataOutputStream的好處。但是由於某種原因,不會打印writeInt(1)和writeUTF(「Peter」)。如果我刪除了BufferedOutputStream,那麼它們就會被寫入。任何想法爲什麼發生這種情況而且,我有興趣通過一次調用發送一個int32和char [8],即連接在一個單獨的PDU中,例如有效載荷「01 00 00 00 AA AA AA AA」 – 2012-08-08 14:28:37

+0

您需要刷新流以推送數據。如果你取出BufferedOutputStream,它會變慢,但你不必刷新數據。如果你想合併int32和char [],那麼你想要緩衝數據,然後在'char []' – 2012-08-08 14:34:55

+0

之後刷新數據:你不能認爲因爲你發送了int32和char []在一起你不會在一次read()中得到這個數據的一部分,(b)在一次read()中有多個「message」c)a和b的某種組合 – 2012-08-08 14:35:59

1

是的。通過指定「%04x」和字符串轉換,可以爲數據隱式選擇十六進制編碼(即將數字轉換爲ASCII字符串)。

改爲使用ByteBuffer將整數轉換爲四個字節。見this answer for details

1

如果要編寫二進制數據,請不要使用PrintWriter或任何其他Writer作爲包裝。請嘗試使用DataOutputStream,它提供了一組寫入整數等的方法。