2012-05-16 78 views
1

Java客户端可以使用TCP连接到C++服务器。 Java客户端在Win7上。 C++服务器在Linux上。如何将数据从Java客户端发送到C++服务器?

问题是我无法成功发送数据到C++服务器。 Java代码是:你的善良帮助

public static void main (String [] args) throws IOException { 
    Socket sock = new Socket("10.217.140.200",7000); 

    String id = "TEST"; 
    char encoding = 'a'; 

    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); 
    oos.flush(); 

    oos.writeObject(encoding); 

后,我现在用的OutputStream和它的作品。请记住删除ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());,否则它会向C++服务器输出4个字符。

+0

您确实没有提供足够的信息来确定问题出在哪里,但是一开始'oos.flush()'应该放在'oos.writeObject()'之后,而不是之前。 – Mac

+0

谢谢,我现在将.flush()移动到末尾 – zhoubo

+0

,我可以将数据从java客户端发送到C++服务器,奇怪的是数据从第四个位置开始存储(不知道为什么0到3的位置是不曾用过 )。 当我在C++端打印接收到的数据时,打印0到3的结果是两个? 任何人都知道前四个位置用于什么? – zhoubo

回答

2

您正在使用ObjectOutputStream,其确实是Java object serialisation。这不是(容易)跨语言移植的。由于您只发送字符串,因此不需要使用ObjectOutputStream - 只需使用从套接字返回的OutputStream即可。

+0

谢谢,我更改为outputstream,现在,我可以将数据从java客户端发送到c + +服务器,奇怪的是,存储的数据从第四个位置开始(不知道为什么是0到3位置不使用)。当我在C++端打印接收到的数据时,打印0到3的结果是两个?任何人都知道前四个位置用于什么? – zhoubo

+0

请用您的更新代码编辑您的原始问题 –

0

我强烈建议使用一些第三方库来对对象进行序列化。手动操作非常耗时(对你而言)并且容易出错。

我个人很喜欢Google Protocol Buffers。我在几乎所有的项目(Java服务器,.Net客户端,C++客户端)上积极使用它。

这是什么? 协议缓冲区是以高效但可扩展的格式对结构化数据进行编码的一种方式。谷歌几乎所有的内部RPC协议和文件格式都使用Protocol Buffers。

不同语言的实现列表是here

0

你也可以在你的C++端使用JNI来处理反序列化的东西。

您不能使用C++直接反序列化Java对象。

0

将代码更新为不使用ObjectOutputStream后,我会猜测您的问题是在C++服务器中,还是因为在通过套接字传输之前没有将字符串转换为ASCII。 Java字符串可以用各种编码表示,包括Unicode。

这样对你有好处吗?

public static void main (String [] args) throws IOException 
{ 
    Socket sock = new Socket("10.217.140.200",7000); 
    String id = "TEST"; 

    OutputStream oos = sock.getOutputStream(); 

    oos.write(id.getBytes("US-ASCII")); 
    oos.flush(); 
} 

如果不是,请通过编辑您的问题发布您更新的客户端和服务器端代码。

+0

尽管我同意您应该明确设置要使用的编码,但考虑到测试字符串仅仅是“测试”,并且这将映射到几乎任何编码方案的正确位置,不要以为这会成为问题。 (我所说的是,平台的默认编码方案很可能在“底部”有ASCII字符集,因此“测试”应该可以工作)。 –

+0

是的,实际上没有必要在里面添加“US-ASCII”,它仍然可以正常工作 – zhoubo

相关问题