2014-03-02 40 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)可能更适合低级二进制协议。