DatagramSocket s = new DatagramSocket(port);
DatagramPacket p;
byte buffer[] = new byte[4096];
while (true) {
p = new DatagramPacket(buffer, buffer.length);
s.receive(p);
// your packet is now in buffer[];
int version = buffer[0] << 24 + buffer[1] << 16 + buffer[2] < 8 + buffer[3];
byte[] serverId = new byte[20];
System.arraycopy(buffer, 4, serverId, 0, 20);
// and process the rest
在实践中,您可能最终会使用辅助函数从字节数组中按网络顺序提取数据字段,或者在注释中指出Tom指出,您可以使用ByteArrayInputStream(),从中可以构造DataInputStream(),有方法从流中读取结构化数据:
while (true) {
p = new DatagramPacket(buffer, buffer.length);
s.receive(p);
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
DataInput di = new DataInputStream(bais);
int version = di.readInt();
byte[] serverId = new byte[20];
di.readFully(serverId);
将数据包读入字节数组,然后从中提取所需的位和字节.这是一个示例,没有异常处理:DatagramSocket s = new DatagramSocket(port);DatagramPacket p;byte buffer[] = new byte[4096];while (true) {p = new DatagramPacket(buffer, buffer.length);s.receive...
import
java
.net.InetAddress;
import
java
.net.NetworkInterface;
import
java
.net.SocketException;
import
java
.util.Enumeration;
* @Program: hy-utils @ClassName
Java
通过 UDP 接收 C 语言结构体数组的
数据
的过程可以分成两个部分,分别是在 C 程序
中
发送
数据
和在
Java
程序
中
接收
数据
。
在 C 程序
中
,需要将结构体数组转换成字节流,并通过 UDP 协议发送出去。具体步骤如下:
1. 定义结构体类型,并创建结构体数组:
typedef struct {
int id;
char name[20];
float score;
} Student;
Student students[3] = {{1, "Tom", 90.5}, {2, "Jerry", 80.5}, {3, "Lucy", 85.0}};
2. 将结构体数组转换成字节流:
char buffer[sizeof(Student) * 3];
memcpy(buffer, students, sizeof(Student) * 3);
3. 创建 UDP 套接字,将字节流发送出去:
int sockfd;
struct sockaddr_in serveraddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = inet_addr(IP);
sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
在
Java
程序
中
,需要接收 UDP
数据包
并将字节流转换成结构体数组。具体步骤如下:
1. 创建 DatagramSocket 对象,指定接收端口号:
```
java
DatagramSocket socket = new DatagramSocket(PORT);
2. 创建 DatagramPacket 对象,用于接收
数据包
:
```
java
byte[] buffer = new byte[sizeof(Student) * 3];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
3. 接收
数据包
:
```
java
socket.receive(packet);
4. 将字节流转换成结构体数组:
```
java
Student[] students = new Student[3];
for (int i = 0; i < 3; i++) {
byte[] data = Arrays.copyOfRange(buffer, i * sizeof(Student), (i + 1) * sizeof(Student));
ByteBuffer byteBuffer = ByteBuffer.wrap(data);
students[i] = new Student(byteBuffer.getInt(), new String(byteBuffer.array(), 4, 20), byteBuffer.getFloat());
其
中
,ByteBuffer 类可以方便地将字节流转换成各种
数据
类型。由于 C 语言
中
的 char 类型是占用 1 个字节的,而
Java
中
的 char 类型是占用 2 个字节的,因此需要将字节流
中
的 char 类型转换成 String 类型。在这里,我们使用了 String 的构造函数,指定了从字节数组第 4 个位置开始读取 20 个字节,以
获取
C 语言
中
的字符串。