限时 5折! 详情

swoole基础-swoole之粘包问题

5708 0 0

什么是粘包问题,为什么我们要讲这个看起来比较奇怪的问题呢?

不着急解释,我们先看一个例子

创建一个server,server端代码如下

<?php

class TcpBufferServer
{
    private $_serv;

    /**
     * init
     */
    public function __construct()
    {
        $this->_serv = new Swoole\Server("127.0.0.1", 9501);
        $this->_serv->set([
            'worker_num' => 1,
        ]);
        $this->_serv->on('Receive', [$this, 'onReceive']);
    }
    public function onReceive($serv, $fd, $fromId, $data)
    {
        echo "Server received data: {$data}" . PHP_EOL;
    }
    /**
     * start server
     */
    public function start()
    {
        $this->_serv->start();
    }
}

$reload = new TcpBufferServer;
$reload->start();

server的代码很简单,仅仅是在收到客户端代码后,标准输出一句话而已,client的代码需要注意了,我们写了一个for循环,连续向server send三条信息,代码如下

<?php

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");

// 向服务端发送数据
for ($i = 0; $i < 3; $i++) {
    $client->send("Just a test.\n");
}
$client->close();

在未运行测试的情况下,我们期望server所在终端输出的结果应该是这样的

Server received data: Just a test.
Server received data: Just a test.
Server received data: Just a test.

注意哦,我们期望的结果是server被回调了3次,才有上述期望的结果值

实际运行的结果呢,是否与我们所期望的一致?我们看下

c484586336-tcp-buffer-1.png

上图左边是server输出的信息。

我们看到,左侧显示的结果是server一次性输出的结果,按理论来说,client发起了3次请求,server应该跟我们期望的结果一致,会

继续阅读

还有85%的精彩内容,购买继续阅读