2014-03-02 41 views
0

問題Java的SSL解決,見下文......用的BufferedWriter和二進制數據

我目前正在開發一個服務器 - 客戶端應用程序。

服務器使用openssl在C/C++中編程,客戶端使用SSLSocket類在android-java中編程。
要寫入SSL套接字(客戶端),我使用BufferefWriter。 我想這是主要的問題,但我對我的問題或替代品的研究是成功的不是......

這是我如何將數據寫入套接字:

BufferedWriter out = new BufferedWriter(new PrintWriter(socket.getOutputStream(), true)); 
// This was a typo char[] data = new byte[] {0,0,0,255}; 
char[] data = new char[] {0,0,0,255}; 
out.write(data); 

現在服務器臨危0,0,195,191
而這真讓我困惑!

但我想這是由於BufferedWriter的工作方式。

那麼,我可以做什麼,以發送二進制數據到SSL套接字?
BufferedWriter有什麼替代方案?

謝謝你的時間!

解決

好感謝麥克道爾和robermann我發現下面的sollution:

BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 
byte[] data = new byte[] {0,0,0,255}; 
out.write(data); 

我不知道有關Java的工作與字符的方式,因而是一種困惑。
有關在java中使用chars的方式的更多信息,請看下面的McDowell的答案。

感謝所有你們! :d

+1

你爲什麼困惑?無論如何,你可以寫一個ByteArrayOutputStream – robermann

+1

這不會編譯:'char [] data = new byte [] ...' - 更正你的代碼。請記住,_char_的寬度爲16位,_PrintWriter_正在執行從UTF-16到平臺編碼的轉碼操作。 Java _char_更像是_wchar_t_; Java _byte_是一個寬度與C _char_相同的8位類型。 – McDowell

+0

@ Ch33f也許你期望在服務器上看到加密的數據? – robermann

回答

2
char[] data = new char[] {0,0,0,255}; 

值是隱式地UTF-16BE。 Android上的默認編碼是UTF-8。對於給定的構造函數,PrintWriter將執行從UTF-16到UTF-8的轉碼操作。

上面的值應該成爲您在服務器上看到的5字節序列00 00 00 c3 bf(在前面有一個字節)。

類似DataOutputStream或更正式的東西(如Google Protocol Buffers)可能更適合低級二進制協議。