java与C++通信问题

chenpengfei1990 2016-08-10 11:56:39
项目中需要java和c++服务器进行通信,C++那边早就写好了,不能动。一开始我的思路是将想要的数据一个个转换为byte数组,然后塞到一个大的byte数组中,用socket一起发过去,这样测试是有效的,C++那边可以正常解析。后来感觉这种方法太烦,想用序列化的方法直接发对象过去,就一直收不到信息了。代码例子如下:

package com.curry.test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

byte [] byte1 = new byte[4];
byte1 = IntToByteArray(10);
for(int i=0;i<byte1.length;i++){
System.out.print(byte1[i]+" ");
}
System.out.println();

A a1 = new A();
a1.a = 10;
byte[] byte2 = null;
ByteArrayOutputStream bo = new ByteArrayOutputStream();
try {
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(a1);
byte2 = bo.toByteArray();
bo.close();
oo.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(int i=0;i<byte2.length;i++){
System.out.print(byte2[i]+" ");
}

}

public static byte[] IntToByteArray(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);
b[3] = (byte) (n >> 24 & 0xff);
return b;
}

}

class A implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4230521614686337323L;
int a;
}


下面是输出结果:


10 0 0 0 //第一种我想要的数组
-84 -19 0 5 115 114 0 16 99 111 109 46 99 117 114 114 121 46 116 101 115 116 46 65 58 -75 -44 -2 -119 -3 -71 43 2 0 1 73 0 1 97 120 112 0 0 0 10//这个结果C++那边无法解析
...全文
182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
我要打NBA 2016-08-11
  • 打赏
  • 举报
回复
引用 3 楼 NewMoons 的回复:
[quote=引用 2 楼 chenpengfei1990 的回复:] [quote=引用 1 楼 NewMoons 的回复:] C++又不知道你那边序列化后的二进制数什么东西,它怎么解析,没理解你想干啥。 你想让C++把序列化的数据转成对象数据?那你C++还要建模,既然C++那边不能动,你这不是矛盾么?
哦哦,懂了。那么要是java想和c++通信,发送c++需要的那种结构体,只能把一个一个数据转换为byte[]用socket发过去吗?[/quote] 在C++那边接口不能动的情况下,只有这个方案了,而且如果有中文的话还要注意编码规则,要和C++那边一致。 即使是C++那边接口可以动,也没必要用序列化,因为序列化的目的主要是为了传输对象(相当于把一些很复杂的对象实例传过去),便于远程调用,不是为了纯粹的数据传输,而且适合用在同语言之间(不同语言你建模就累死了)。 不同语言之间如果为了远程调用,一般都用webservice或rpc(异步的话可用jms,但jms更多用于java之间,不同语言支持不如webservice),也不会直接用这么基础的socket去通信的,很多东西要自己处理,没必要,除非你的系统通信对效率和传输安全要求极高。[/quote] 的确对安全要求很高。。。websevice好像是基于http的吧?现在C++服务器只接收socket传输的方式
NewMoons 2016-08-11
  • 打赏
  • 举报
回复
引用 2 楼 chenpengfei1990 的回复:
[quote=引用 1 楼 NewMoons 的回复:] C++又不知道你那边序列化后的二进制数什么东西,它怎么解析,没理解你想干啥。 你想让C++把序列化的数据转成对象数据?那你C++还要建模,既然C++那边不能动,你这不是矛盾么?
哦哦,懂了。那么要是java想和c++通信,发送c++需要的那种结构体,只能把一个一个数据转换为byte[]用socket发过去吗?[/quote] 在C++那边接口不能动的情况下,只有这个方案了,而且如果有中文的话还要注意编码规则,要和C++那边一致。 即使是C++那边接口可以动,也没必要用序列化,因为序列化的目的主要是为了传输对象(相当于把一些很复杂的对象实例传过去),便于远程调用,不是为了纯粹的数据传输,而且适合用在同语言之间(不同语言你建模就累死了)。 不同语言之间如果为了远程调用,一般都用webservice或rpc(异步的话可用jms,但jms更多用于java之间,不同语言支持不如webservice),也不会直接用这么基础的socket去通信的,很多东西要自己处理,没必要,除非你的系统通信对效率和传输安全要求极高。
我要打NBA 2016-08-11
  • 打赏
  • 举报
回复
引用 1 楼 NewMoons 的回复:
C++又不知道你那边序列化后的二进制数什么东西,它怎么解析,没理解你想干啥。 你想让C++把序列化的数据转成对象数据?那你C++还要建模,既然C++那边不能动,你这不是矛盾么?
哦哦,懂了。那么要是java想和c++通信,发送c++需要的那种结构体,只能把一个一个数据转换为byte[]用socket发过去吗?
树成 2016-08-11
  • 打赏
  • 举报
回复
那看你是国企还是私企了,私企就跟老板商量,老板会衡量利益关系,国企的话,你就慢慢整吧。
我要打NBA 2016-08-11
  • 打赏
  • 举报
回复
引用 5 楼 spiniper 的回复:
不要为难以实现的功能付出太多的代价,如果C++没有提供对外的数据接口(语言无关性),那么就必须改,凡事要走正路,如果对方不提供接口而想用突破的方式访问,那么带来的后果是不可预测和灾难性的,而且你为了实现这种操蛋的功能而花费过多的代价根本就是得不偿失的2B行为。
啊啊啊啊。。。额,领导不让啊。。。。看来只能慢慢将需要的包结构塞到byte[]发过去
树成 2016-08-11
  • 打赏
  • 举报
回复
不要为难以实现的功能付出太多的代价,如果C++没有提供对外的数据接口(语言无关性),那么就必须改,凡事要走正路,如果对方不提供接口而想用突破的方式访问,那么带来的后果是不可预测和灾难性的,而且你为了实现这种操蛋的功能而花费过多的代价根本就是得不偿失的2B行为。
NewMoons 2016-08-10
  • 打赏
  • 举报
回复
C++又不知道你那边序列化后的二进制数什么东西,它怎么解析,没理解你想干啥。 你想让C++把序列化的数据转成对象数据?那你C++还要建模,既然C++那边不能动,你这不是矛盾么?

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧