找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 39|回复: 0

[相关杂项] php 使用TCP套接字创建自定义数据包格式

[复制链接] IP属地:广东省广州市
发表于 2024-6-19 12:14:12 | 显示全部楼层 |阅读模式
本帖最后由 shiy720 于 2024-6-19 12:18 编辑

在PHP中,您可以使用TCP套接字创建自定义数据包格式。以下是如何定义自定义数据包格式并通过TCP连接发送/接收数据包的示例:
Packet format:

  1. <?php

  2. class Packet {
  3.     public $header; // 1 byte header
  4.     public $id; // 4 byte integer
  5.     public $message; // variable-length string
  6.     public $data; // variable-length byte array
  7. }

  8. ?>
复制代码

Packet serialization:
  1. <?php

  2. function serializePacket(Packet $packet) {
  3.     $data = '';
  4.     $data .= chr($packet->header); // 1 byte header
  5.     $data .= pack('N', $packet->id); // 4 byte integer
  6.     $data .= pack('N', strlen($packet->message)); // string length
  7.     $data .= $packet->message; // variable-length string
  8.     $data .= pack('N', count($packet->data)); // byte array length
  9.     $data .= implode('', $packet->data); // variable-length byte array
  10.     return $data;
  11. }

  12. ?>
复制代码

Packet deserialization:
  1. <?php

  2. function deserializePacket($data) {
  3.     $packet = new Packet();
  4.     $packet->header = ord($data[0]); // 1 byte header
  5.     $packet->id = unpack('N', substr($data, 1, 4))[1]; // 4 byte integer
  6.     $messageLength = unpack('N', substr($data, 5, 4))[1]; // string length
  7.     $packet->message = substr($data, 9, $messageLength); // variable-length string
  8.     $dataLength = unpack('N', substr($data, 9 + $messageLength, 4))[1]; // byte array length
  9.     $packet->data = array_values(unpack('C*', substr($data, 13 + $messageLength, $dataLength))); // variable-length byte array
  10.     return $packet;
  11. }

  12. ?>
复制代码

TCP client example:
  1. <?php

  2. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  3. socket_connect($socket, 'localhost', 8080);

  4. $packet = new Packet();
  5. $packet->header = 0x01;
  6. $packet->id = 1;
  7. $packet->message = 'Hello, World!';
  8. $packet->data = array(0x01, 0x02, 0x03);

  9. $data = serializePacket($packet);
  10. socket_write($socket, $data, strlen($data));

  11. $response = '';
  12. socket_read($socket, 1024, PHP_NORMAL_READ);
  13. $responsePacket = deserializePacket($response);

  14. echo "Received packet: Id={$responsePacket->id}, Message={$responsePacket->message}, Data=" . implode(',', $responsePacket->data) . "\n";

  15. socket_close($socket);

  16. ?>
复制代码

在本例中,我们定义了一个Packet类,该类包含一个标头字节、一个整数ID、一个字符串消息和一个字节数组数据。然后,我们定义函数来将数据包序列化到字符串和从字符串反序列化数据包。

我们创建一个TCP客户端,连接到服务器,并通过网络发送数据包。服务器可以接收数据包,对其进行反序列化,并将响应数据包发送回客户端。

请注意,这只是一个基本示例,您应该根据您的具体用例考虑实现错误处理、数据包碎片和其他功能。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|西兴社区 ( 蜀ICP备2022005627号 )|网站地图

GMT+8, 2024-9-8 11:33 , Processed in 0.599175 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表