Java客户端可以使用TCP连接到C ++服务器。 Java客户端在Win7上。 C ++服务器在Linux上。
问题是我无法成功将数据发送到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());
,否则它会输出4个字符到c ++服务器。
答案 0 :(得分:2)
您使用的是ObjectOutputStream
Java object serialisation。这不是(轻松)跨语言可移植。由于您只发送一个字符串,因此您不需要使用ObjectOutputStream
- 只需使用套接字返回的OutputStream
。
答案 1 :(得分:0)
我强烈建议您使用某些第三方库来序列化对象。手动完成这项工作非常耗时(对您而言)并且容易出错。
我个人是Google Protocol Buffers的忠实粉丝。我几乎在所有项目中都使用它(Java服务器,.Net客户端,C ++客户端)。
这是什么? 协议缓冲区是一种以高效且可扩展的格式编码结构化数据的方法。 Google对几乎所有内部RPC协议和文件格式都使用Protocol Buffers。
不同语言的实施列表是 here 。
答案 2 :(得分:0)
您也可以在C ++端使用JNI来处理反序列化的内容。
您无法使用C ++直接反序列化Java对象。
答案 3 :(得分:0)
更新代码后不使用ObjectOutputStream,我猜你的问题是在C ++服务器上,还是因为在通过套接字传输之前没有将String转换为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();
}
如果没有,请通过编辑问题发布更新的客户端和服务器端代码。