http://blog.csdn.net/xwchen/article/details/1585908

最近给个朋友做个网站的客户端,使用C/S模式,Client为VC6开发,Server为Java,通过Socket通信。由于Client这边为C++,所以,在接受Java发过来的数据包时,需要知道发来的包的长度,所以,就要引入变长包的机制。

方法是:首先Server发送一个包头,如下:

// packet head
typedef struct tagPacketHead{
long PacketID;
long PacketLen;
}PacketHead;

包头后面跟上包体,其中包体的长度,就是上面结构体中的PacketLen,Clinet首先接受包头,因为包头是两边约定好的,所以可以直接Receive一个定长的消息,也就是这个包头的长度的消息,从包头中取得包体的长度后,就可以再次Receive一个包体长度的消息了。那么Java中如何发送一个结构体呢?下面是解决方法:


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();
}
}
}

从Client端发到Server的数据就无须特殊处理了,Java的流可以很好的处理这些。

Java中发送结构体相关推荐

  1. java解析c语言的结构体,JAVA中如何实现C中的结构体数组的功能?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 比如我想实现在C++中的结构体数组: struct student{ string Sno; string Sname; string Sgen; str ...

  2. java中结构体入参_JNA中自定义结构体如何传参?

    1.先给出C的头文件里的结构体: typedef struct DetectionZone { Zone zone; DetectionZoneParam param; } DetectionZone ...

  3. java 链表放置结构体_结构体和它在链表中的使用

    一.结构体 由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的. 1.1如何声明结构体呢? struct 结构体名  //结构体名字用作结构体类型的标志 {成员列表}; ...

  4. java和C结构体通信

    主要是看代码分析别人写的发送结构体思路,如内存补0操作: package com.cvicse.naba.service.impl.user; import java.util.ArrayList; ...

  5. JNA参数类型转换(含接收、发送结构体)——JNA-JNI(五)

    JNA参数类型转换(含接收.发送结构体)--JNA-JNI(五) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使用JNA调用C++动态 ...

  6. c语言发送结构体 文件

    Linux C Socket编程发送结构体.文件详解及实例 利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式 ...

  7. 关于VC网络编程中用 char 发送结构体的说明

    关于VC网络编程中用 char 发送结构体的说明     在VC中要发送struct的程序,如果需要中间打包的话,首先因该将结构体转换为字节型的.然后再用 send (SOCKET s,const c ...

  8. linux socket 结构定义 send,Linux下Socket编程中用send发送结构体

    Linux网络通信 Linux下多客户端聊天软件 最近在开发一个Linux下的聊天软件,好久没有做C语言的开发了,感觉到很多东西已经生疏了,这下又碰到用Socket传递结构体的问题,google了一下 ...

  9. Linux结构体变量报错,C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

最新文章

  1. Nginx做前端代理时缓存与否的性能差别
  2. C语言——第六周作业
  3. Android dependency 'com.android.support:support-v4' has different version for the compile (26.1.0...
  4. dazhilu网站代码【完整篇】
  5. lnmp下mysql创建新用户授权后登录报错 1045 Access denied for user 'name'@'localhost
  6. 小汤学编程之jQuery学习day01——简介、入门、选择器
  7. python在土木工程方面的应用案例_给Python小白看的10个使用案例,入门Python就在这里了...
  8. cocos2d0基础篇笔记二
  9. Spring学习笔记之基础、IOC、DI(1)
  10. 环洋调研报告-2021年全球MEMS射频开关行业调研及趋势分析报告
  11. 【Cubase11】音乐工作站:宿主软件 - 基础入门笔记
  12. react中使用构建缓存_如何使用React,GraphQL和Okta构建健康跟踪应用
  13. Google MapReduce论文中文版
  14. 7.微信小程序(布局适配与物理逻辑像素)
  15. SVD因式分解实现协同过滤-及源码实现
  16. Xilinx ISE 出现 Bitgen:342 - This design contains pins which have locations (LOC)...解决办法
  17. 查看Ubuntu操作系统的kernel config文件方法
  18. Hive 日期时间操作
  19. Docker与k8s的恩怨情仇 系列
  20. 服务器如何防范勒索病毒以及安全加固

热门文章

  1. html 二级菜单延迟消失,如果让子菜单延迟消失?
  2. pdo mysql 存储过程 out_PHP_PDO 调用mysql 带返回参数的存储过程
  3. 一个html5页面,html5做一个黑板报页面
  4. c语言在win8系统不兼容,Win8系统中存在不兼容软件怎么办?
  5. c语言编译无错误但不能输入输出,第2章-C语言版输入输出.ppt
  6. CentOS 8下安装MySQL8.0
  7. springboot实现多线程service实现
  8. javax.el.ELException: Provider com.sun.el.ExpressionFactoryImpl not found
  9. 14K Star,「程序员做饭指南」冲上热榜
  10. 华为宣布了,手机将全面支持鸿蒙!