《 swooleThinkphp 》TCP 服务器 【 五 】


TCP 服务器




TCP 协议是一个可靠的传输协议,当数据传输中需要可靠的数据传输,并且数据到达顺序严格遵守发送顺序。如果数据传输失败需要重试,并且可以容忍偶尔发生延时,则推荐使用 TCP 协议。


在网络游戏开发中,TCP 协议扮演了重要的角色,很多即时对战的游戏都严重的依赖 TCP 协议。如魔兽世界,穿越火线等

> 当然,像魔兽世界这种大型网络游戏不可能只使用一种网络协议,我们只是针对当前章节举例

TCP 协议需要为每个客户端都建立一个 Socket 连接,传输的数据包没有大小限制。相比 UDP 协议而言,TCP 协议对服务器性能要求更大。


接下来我们演示一下,如何使用 ThinkPHP5 和 Swoole 来建立一个 TCP 服务器。


创建 ThinkPHP5 自定义命令行

1.创建命令行类

创建application/console/TcpServer.php文件


<?php

namespace app\Console;


use think\console\Command;
use think\console\Input;
use think\console\Output;

class TcpServer extends Command
{
    protected $server;
    // 命令行配置函数
    protected function configure()
    {
        // setName 设置命令行名称
        // setDescription 设置命令行描述
        $this->setName('tcp:start')->setDescription('Start TCP Server!');
    }
    // 设置命令返回信息
    protected function execute(Input $input, Output $output)
    {
        $this->server = new \swoole_server('0.0.0.0', 9501);
        $this->server->set([
            'worker_num' => 4,
            'daemonize'  => false,
        ]);
        $this->server->on('Start', [$this, 'onStart']);
        $this->server->on('Connect', [$this, 'onConnect']);
        $this->server->on('Receive', [$this, 'onReceive']);
        $this->server->on('Close', [$this, 'onClose']);
        $this->server->start();
        // $output->writeln("TCP: Start.\n");
    }
    // 主进程启动时回调函数
    public function onStart(\swoole_server $serv)
    {
        echo "Start\n";
    }
    // 建立连接时回调函数
    public function onConnect(\swoole_server $server, $fd, $from_id)
    {
        echo "Connect\n";
    }
    // 收到信息时回调函数
    public function onReceive(\swoole_server $server, $fd, $from_id, $data)
    {
        echo "message: {$data} form Client: {$fd} \n";
        // 将受到的客户端消息再返回给客户端
        $server->send($fd, "Message form Server: ".$data);
    }
    // 关闭连时回调函数
    public function onClose(\swoole_server $server, $fd, $from_id)
    {
        echo "Close\n";
    }
}



TCP 服务器常用的回调函数是onStart,onConnect,onReceive,onClose,分别是主进程的主线程启动时回调,客户端连接时回调,收到信息时回调,关闭连接时回调。接下来的章节介绍的onWorkerStart,onTimer,onTask,onFinish,等回调函数也可以应用在 TCP 服务器,本章节暂时不详述。

2.修改配置文件

文件所在 application/command.php


<?php

return [
    'app\console\TcpServer',
];


接下来就可以通过命令行来启动 TCP 服务器


$ > php think tcp:start


看见如下返回说明 TCP 服务器启动成功



使用telnet工具来连接 TCP 服务器,下个章节我们会直接讲解如何使用 Swoole 的 TCP 客户端来连接 TCP 服务器


telnet 127.0.0.1 9501


输入Hello后会得到以下结果

Hello
Message form Server: Hello



同时服务器端也会显示出以下回执消息,来显示 TCP 服务器的客户端连接状态



Start

Connect

message: Hello

form Client: 1