以下是我在做java和c++ socket通信过程中如何正确使用java接收函数的问题,主要还是为了完成项目,可能不够详细,请多多指正:
1、c++端发送:如果发送的是整型等多字节类型,必须先要经过大小端的转换才可以发送,java端接收此种类型时用readInt、readFloat等函数,否则java端会出现乱码;
大小端代码转换如下:
#define BSWAP_32(x) \
(UINT32) ( (( ((UINT32)(x)) & 0xff000000 ) >> 24) | \
(( ((UINT32)(x)) & 0x00ff0000 ) >> 8 ) | \
(( ((UINT32)(x)) & 0x0000ff00 ) << 8 ) | \
(( ((UINT32)(x)) & 0x000000ff ) << 24) \
)
#define BSWAP_16(x) \
(UINT16) ( ((((UINT16)(x)) & 0x00ff) << 8 ) | \
((((UINT16)(x)) & 0xff00) >> 8 ) \
)
//c++端
int tmp = 20;
int length = BSWAP_32(tmp);
int ret = send(sock, (char*)&length, sizeof(int), 0);
..................
//java端
................
int tmp = in.readInt();
...........
2、c++端发送字符串时,java端用一个byte数组接收,用到的函数是int read(byte[] b,int off,int len),如果用该函数,在接收之前应先发送该字符串的长度;
//c++端
string str = "hello world";
ret = send(sock, str.c_str(), str.length(), 0);
........
//java端
byte[] tmp = new byte[size];
in.read(tmp, 0, tmp.length);
String str = new String(tmp);
............
3、c++发送字符数组时,java端用intread(byte[] b)来接收就可以了。
//c++端
char* buffer = ......;
int ret = send(sock, buffer, bufferSize, 0);
.............
//java端
buffer = new byte[bufferSize];
int size = in.read(buffer);
..................
4、java端发送字符串,用void write(byte[] b);我个人认为c++端不知道发送的字符串有多长,所以首先向c++端发送一个字符串长度,然后再发送字符串;
//java发送端
out.writeByte((byte)fileNameLength);
..............
out.write(fileName.getBytes());
...............
5、java端发送数组,我个人认为不管是什么类型的数组,应该先转换成byte数组再发送出去
out.write(buffer, 0, bufferSize);
以上是我个人在做项目过程中总结的,有不足之处,欢迎大家来交流