现在的位置: 首页 > 综合 > 正文

c++和java在socket通信过程中发送和接收函数的问题

2013年09月17日 ⁄ 综合 ⁄ 共 1334字 ⁄ 字号 评论关闭

以下是我在做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端用int read(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);

以上是我个人在做项目过程中总结的,有不足之处,欢迎大家来交流

抱歉!评论已关闭.