java与c/c++进行socket通信的一些问题(1)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

近几天看到csdn上问c/c++和Java通信的问题比较多,非凡是c特有的数据结构(如strUCt)。

特地根据网友的一个问题举个例子,希望对初学者有所帮助。

原问题见:http://community.csdn.net/EXPert/topic/3886/3886989.XML?temp=.3527033

这类问题通常是为了利用原有Server或者Server不能做修改(通常是c/c++)造成。

比如Server端只接收一个结构Employee,定义如下:

struct UserInfo {

char UserName[20];

int UserId;

};

struct Employee {

UserInfo user;

float salary;

};

当然也可以定义为

struct Employee {

char name[20];

int id;

float salary;

};

java client 测试源码(为说明问题,假设struct字节对齐,sizeof(Employee)=28)

import java.net.*;

/**

* 与C语言通信(java做Client,c/c++做Server,传送一个结构)

* @author kingfish

* @version 1.0

*/

class Employee {

private byte[] buf = new byte[28]; //为说明问题,定死大小,事件中可以灵活处理

/**

* 将int转为低字节在前,高字节在后的byte数组

*/

private static byte[] toLH(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;

}

/**

* 将float转为低字节在前,高字节在后的byte数组

*/

private static byte[] toLH(float f) {

return toLH(Float.floatToRawIntBits(f));

}

/**

* 构造并转换

*/

public Employee(String name, int id, float salary) {

byte[] temp = name.getBytes();

System.arraycopy(temp, 0, buf, 0, temp.length);

temp = toLH(id);

System.arraycopy(temp, 0, buf, 20, temp.length);

temp = toLH(salary);

System.arraycopy(temp, 0, buf, 24, temp.length);

}

/**

* 返回要发送的数组

*/

public byte[] getBuf() {

return buf;

}

/**

* 发送测试

*/

public static void main(String[] args) {

try {

Socket sock = new Socket("127.0.0.1", 8888);

sock.getOutputStream().write(new Employee("kingfish", 123456789, 8888.99f).

getBuf());

sock.close();

}

catch (Exception e) {

e.printStackTrace();

}

} //end

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航