另一端是Java写客户端程序,两者之间需要通信。c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组。 解决方法:c++/c socket 在发送结构体的时候其实发送的也是字节流。因为结构体本身也是内存中的一块连续数据。问题就变成了如何把结构体手动转成字节的问题了采用类似的报头:
// packet head typedef struct tagPacketHead{ long PacketID; long PacketLen;}
PacketHead;此时套接口的读写方式为先读报头,在报头中取出数据负载的长度,然后再读相应字节的数据。 包头后面跟上包体,其中包体的长度,就是上面结构体中的PacketLen,Clinet首先接受包头,因为包头是两边约定好的,所以可以直接Receive一个定长的消息,也就是这个包头的长度的消息,从包头中取得包体的长度后,就可以再次Receive一个包体长度的消息了。那么Java中如何发送一个结构体呢?下面是解决方法: 使用C/S模式,Client为VC6开发,Server为Java,通过Socket通信。
package org.charry.org; import java.net.*; /** * * 字节转换,参考网络文章 */ class Packet { private byte[] buf = null; /** * 将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 Packet(int packetID, int packetLen, String packetBody) { byte[] temp = null; buf = new byte[packetBody.getBytes().length + 8]; temp = toLH(packetID); System.arraycopy(temp, 0, buf, 0, temp.length); temp = toLH(packetLen); System.arraycopy(temp, 0, buf, 4, temp.length); System.arraycopy(packetBody.getBytes(), 0, buf, 8, packetBody.length()); } /** * 返回要发送的数组 */ public byte[] getBuf() { return buf; } /** * 发送测试 */ public static void main(String[] args) { try { String tmp = “test string!”; Socket sock = new Socket(”127.0.0.1″, 8888); sock.getOutputStream().write( new Packet(123, tmp.length(), tmp).getBuf()); sock.close(); } catch (Exception e) { e.printStackTrace(); } } }
时间: 2024-10-02 03:04:36