java与c/c++进行socket通信的一些问题(1)
2011-01-25 10:48
731 查看
比如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)
---------------------------------------------------------------------------
当然,也可以利用writeInt,writeFloat方法发送,但字节顺序需要改为低在前。
这个问题稍后在讨论。
如有任何问题,请指正!
kingfish
2005.3.29
本文转自:http://blog.csdn.net/kingfish/archive/2005/03/29/333635.aspx
对于java端的接收有些问题,
我列出我们以前的接收函数:
接收流函数:
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
---------------------------------------------------------------------------
当然,也可以利用writeInt,writeFloat方法发送,但字节顺序需要改为低在前。
这个问题稍后在讨论。
如有任何问题,请指正!
kingfish
2005.3.29
本文转自:http://blog.csdn.net/kingfish/archive/2005/03/29/333635.aspx
对于java端的接收有些问题,
我列出我们以前的接收函数:
public String Receive() throws IOException { byte[] buffer = new byte[8];//byte[1024] int count = 0; ips=_Socket.getInputStream(); ios=new DataInputStream(ips); if (listMsg.size() == 0) { count=ios.read(buffer, 0, buffer.length);//获取字符数组和其长度 String str=new String(buffer,0,count,"gb2312");//转换成字符串 String[] strs=str.split("//|"); for (int i = 0; i < strs.length; i++) { if (strs[i].toString() != "") { listMsg.add(strs[i]); } } str = listMsg.get(0).toString().trim(); listMsg.remove(0); buffer = null; return str; } else { String str = listMsg.get(0).toString().trim(); listMsg.remove(0); buffer = null; return str; } }
接收流函数:
/* * 接收流,注意流的大小,避免溢出 * linc * 2010-9-13 */ public byte[] ReceiveStream() throws Exception { String str = Receive(); int num = Integer.parseInt(str);//获得流的长度 Send("0|",false); ByteArrayOutputStream _bytestream=new ByteArrayOutputStream(); InputStream _InputStream=_Socket.getInputStream(); int Length=0; byte[] buffer = new byte[1024]; while (Length < num) { int temp_length = buffer.length;//1024 if ((num - Length) < temp_length) { temp_length = num - Length; } _InputStream.read(buffer, 0, temp_length); _bytestream.write(buffer, 0, temp_length); Length += temp_length; Send(String.valueOf(Length),false); } return _bytestream.toByteArray(); }
相关文章推荐
- java与c/c++进行socket通信的一些问题(2)
- java与c/c++进行socket通信的一些问题(1)
- java与c/c++进行socket通信的一些问题(1)-JSP教程,Java技巧及代码
- java与c/c++进行socket通信的一些问题(2)
- java与c/c++进行socket通信的一些问题(1)
- java与c/c++进行socket通信的一些问题
- java与c/c++进行socket通信的一些问题
- java与c/c++进行socket通信的一些问题(1)-JSP教程,Java技巧及代码
- java与c/c++进行socket通信的一些问题(2)
- java与c/c++进行socket通信的一些问题
- java与C、C++进行通信的一些问题
- java c++ 进行socket通信对数据包的组装和拆分问题
- java 与 c/c++的socket通信问题
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- C++服务器与java进行socket通信案例
- C++服务器与java进行socket通信案例
- java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决
- c++与android进行Socket通信问题探究
- Android与PC客户端进行Socket通信的一些问题
- java与 C++ 之间进行 SOCKET 通信