PHPackages                             1449489029/protocol-packet-encode - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. 1449489029/protocol-packet-encode

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

1449489029/protocol-packet-encode
=================================

v1.0.1(2y ago)09PHPPHP &gt;=8.0

Since Jul 26Pushed 2y ago1 watchersCompare

[ Source](https://github.com/1449489029/protocol-packet-encode)[ Packagist](https://packagist.org/packages/1449489029/protocol-packet-encode)[ RSS](/packages/1449489029-protocol-packet-encode/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (2)Dependencies (1)Versions (3)Used By (0)

协议包解析
=====

[](#协议包解析)

封装对各种编码类型协议包的处理。 程序员只需要继承 `ProtocolPacketEncode\Protocol`，继承后只需要做两件事：

- 实现 `definePacketFormat` 方法，该方法主要是定义协议包的数据格式；

例如：

```
 class BasicPkt extends Protocol
{
    // 省略其他代码 ...

    /**
     * 定义协议包格式
     * 这里是配置协议包格式的核心
     *
     * @return void
     */
    protected function definePacketFormat(): void
    {
        $protocolFormat = (new ProtocolFormat())
            ->addField(ProtocolFormat::DataTypeUint16, 'code')
            ->addField(ProtocolFormat::DataTypeString, 'body', false);
        // 二进制编码格式
        $this->packet = new BinaryPacket($protocolFormat);
        // JSON 编码格式
        // $this->packet = new JsonPacket($protocolFormat);
    }
}
```

- 其次是定义协议包的字段以及字段的`get`与`set`方法。

例如：

```
class BasicPkt extends Protocol
{
    // 代码
    public int $code;
    // 消息载体
    public string $body = '';

    public function getCode(): int
    {
        return $this->code;
    }

    public function setCode(int $code): self
    {
        $this->code = $code;
        return $this;
    }

    public function getBody(): string
    {
        return $this->body;
    }

    public function setBody(string $body): self
    {
        $this->body = $body;
        return $this;
    }

    // 省略其他代码 ...
}
```

安装
--

[](#安装)

```
$ composer require 1449489029/protocol-packet-encode

```

支持编码类型：
-------

[](#支持编码类型)

- 二进制
- JSON

示例
--

[](#示例)

### 协议包格式

[](#协议包格式)

```
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Code             |          Body Length        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Body                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Body                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             ....                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                       Example Basic Packet

```

### 协议包类封装

[](#协议包类封装)

```
namespace test;

use ProtocolPacketEncode\Protocol;
use ProtocolPacketEncode\ProtocolFormat;
use ProtocolPacketEncode\BinaryPacket;
use ProtocolPacketEncode\JsonPacket;

class BasicPkt extends Protocol
{
    // 代码类型
    public const PING = 1;
    public const PONG = 2;

    // 代码
    public int $code;
    // 消息载体
    public string $body = '';

    /**
     * 定义协议包格式
     * 这里是配置协议包格式的核心
     *
     * @return void
     */
    protected function definePacketFormat(): void
    {
        $protocolFormat = (new ProtocolFormat())
            ->addField(ProtocolFormat::DataTypeUint16, 'code')
            ->addField(ProtocolFormat::DataTypeString, 'body', false);
        $this->packet = new BinaryPacket($protocolFormat);
//        $this->packet = new JsonPacket($protocolFormat);
    }

    public function getCode(): int
    {
        return $this->code;
    }

    public function setCode(int $code): self
    {
        $this->code = $code;
        return $this;
    }

    public function getBody(): string
    {
        return $this->body;
    }

    public function setBody(string $body): self
    {
        $this->body = $body;
        return $this;
    }
}
```

### 单元测试

[](#单元测试)

```
namespace test;

use PHPUnit\Framework\TestCase;

class BasicPktTest extends TestCase
{

    // 测试Ping消息的打包与解包 带有内容
    public function testPackAndUnpackPingMessageWhitBody()
    {
        // 数据准备
        $code = BasicPkt::PING; // 2 字节
        // 隐藏字段(Body Length) 2 字节
        $body = 'sdasdasdasdas'; // 13 字节
        $bytesLength = 2 + 2 + 13;

        // 打包
        $basicPktProtocol = new BasicPkt();
        $basicPktProtocol->setCode($code);
        $basicPktProtocol->setBody($body);
        $string = $basicPktProtocol->encode();

        // 验证编码后的长度
        $this->assertEquals(strlen($string), $bytesLength);

        // 解包
        $newBasicPktProtocol = new BasicPkt();
        $newBasicPktProtocol->decode($string);

        // 验证解包后的长度
        $this->assertEquals(0, strlen($string));

        // 验证
        $this->assertEquals($newBasicPktProtocol->getCode(), $code);
        $this->assertEquals($newBasicPktProtocol->getBody(), $body);
    }

    // 测试Pong消息的打包与解包 带有内容
    public function testPackAndUnpackPongMessageWhitBody()
    {
        // 数据准备
        $code = BasicPkt::PONG; // 2 字节
        // 隐藏字段(Body Length)    2 字节
        $body = 'dasdasdasdas'; // 12 字节
        $bytesLength = 2 + 2 + 12;

        // 打包
        $basicPktProtocol = new BasicPkt();
        $basicPktProtocol->setCode($code);
        $basicPktProtocol->setBody($body);
        $string = $basicPktProtocol->encode();

        // 验证编码后的长度
        $this->assertEquals(strlen($string), $bytesLength);

        // 解包
        $newBasicPktProtocol = new BasicPkt();
        $newBasicPktProtocol->decode($string);

        // 验证解包后的长度
        $this->assertEquals(0, strlen($string));

        // 验证
        $this->assertEquals($newBasicPktProtocol->getCode(), $code);
        $this->assertEquals($newBasicPktProtocol->getBody(), $body);
    }
}
```

运行测试：

```
$ composer test

```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

1027d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/bc3ef4640d7f8e466c91ed93729682b59e74605d215cdf62670e747d12374447?d=identicon)[1449489029](/maintainers/1449489029)

---

Top Contributors

[![1449489029](https://avatars.githubusercontent.com/u/26200988?v=4)](https://github.com/1449489029 "1449489029 (10 commits)")

---

Tags

php

### Embed Badge

![Health badge](/badges/1449489029-protocol-packet-encode/health.svg)

```
[![Health](https://phpackages.com/badges/1449489029-protocol-packet-encode/health.svg)](https://phpackages.com/packages/1449489029-protocol-packet-encode)
```

###  Alternatives

[qinchen/web-utils

A web application common utils

111.4k](/packages/qinchen-web-utils)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
