TCP 服务
swoole 文档 - TCP 服务
tcp 服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?php
$host = "0.0.0.0";
$serv = new Swoole\Server($host, 9000);
$serv->set([ 'heartbeat_idle_time' => 10, 'heartbeat_check_interval' => 3, ]);
$serv->on('Start', function($serv) use($host){ echo "启动 swoole 监听的信息tcp:$host:9000\n"; });
$serv->on('Connect', function ($serv, $fd) { echo "Client: 连接成功.\n"; });
$serv->on('Receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "Server: ".$data); });
$serv->on('Close', function ($serv, $fd) { echo "断开连接.\n"; });
$serv->start();
|
这样就创建了一个 TCP 服务器,监听本机 9000 端口。
然后先启动服务,然后再通过 telnet 命令去连接试试
1 2 3 4 5 6
| php swoole_tcp_server.php
telnet 127.0.0.1 9000
|
tcp 客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?php
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9000, 0.5)) { die("connect failed."); }
function order() { sleep(4); return "order\n"; }
if (!$client->send(order())) { die("send failed."); }
$data = $client->recv(); if (!$data) { die("recv failed."); }
$client->close();
echo '订单生成成功'."\n";
|
运行 tcp 客户端去连接服务端,假设处理需要时间,最后就会输出订单生成成功
1 2
| php swoole_tcp_client.php
|
UDP 服务
swoole 文档 - UDP 服务
udp 服务端
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
$serv = new swoole_server("0.0.0.0", 9000, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
$serv->on('Packet', function ($serv, $data, $clientInfo) { $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo); }); echo "0.0.0.0:9000\n";
$serv->start();
|
udp 客户端
1 2 3 4 5 6
| <?php $client = new swoole_client(SWOOLE_SOCK_UDP); $client->sendTo('127.0.0.1', 9000, 'upd');
$data = $client->recv(); var_dump($data);
|
两种协议
TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的,可靠的,基于字节流的传输通信协议。
UDP(User Datagram Protocol 用户数据报协议):是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
UDP 服务器与 TCP 服务器不同,UDP 没有连接的概念。启动 Server 后,客户端无需 Connect,直接可以向 Server 监听的 9502 端口发送数据包。
长连接、短连接
Http长连接和TCP长连接的区别
Http长连接 和 TCP长连接的区别在于: TCP 的长连接需要自己去维护一套心跳策略。,而Http只需要在请求头加入keep-alive:true
即可实现长连接。