shiy720 发表于 2024-6-19 12:14:12

php 使用TCP套接字创建自定义数据包格式

本帖最后由 shiy720 于 2024-6-19 12:18 编辑

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

<?php

class Packet {
    public $header; // 1 byte header
    public $id; // 4 byte integer
    public $message; // variable-length string
    public $data; // variable-length byte array
}

?>
Packet serialization:
<?php

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

?>
Packet deserialization:
<?php

function deserializePacket($data) {
    $packet = new Packet();
    $packet->header = ord($data); // 1 byte header
    $packet->id = unpack('N', substr($data, 1, 4)); // 4 byte integer
    $messageLength = unpack('N', substr($data, 5, 4)); // string length
    $packet->message = substr($data, 9, $messageLength); // variable-length string
    $dataLength = unpack('N', substr($data, 9 + $messageLength, 4)); // byte array length
    $packet->data = array_values(unpack('C*', substr($data, 13 + $messageLength, $dataLength))); // variable-length byte array
    return $packet;
}

?>
TCP client example:
<?php

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

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

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

$response = '';
socket_read($socket, 1024, PHP_NORMAL_READ);
$responsePacket = deserializePacket($response);

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

socket_close($socket);

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

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

请注意,这只是一个基本示例,您应该根据您的具体用例考虑实现错误处理、数据包碎片和其他功能。
页: [1]
查看完整版本: php 使用TCP套接字创建自定义数据包格式