tcp 服务端服务器
<?php // 1. 建立 swoole 默认建立的是一个同步的阻塞tcp服务 $host = "0.0.0.0"; // 0.0.0.0 表明接听全部 // 默认是tcp $serv = new Swoole\Server($host, 9000); // 添加配置 $serv->set([ 'heartbeat_idle_time' => 10, 'heartbeat_check_interval' => 3, ]); // 2. 注册事件 $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"; }); // 3. 启动服务器 // 阻塞 $serv->start(); // 阻塞与非阻塞
这样就建立了一个 TCP 服务器,监听本机 9000 端口。swoole
而后先启动服务,而后再经过 telnet 命令去链接试试tcp
php swoole_tcp_server.php # 启动 swoole 监听的信息tcp:0.0.0.0:9000 telnet 127.0.0.1 9000 # Trying 127.0.0.1... # Connected to localhost.
tcp 客户端code
<?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 客户端去链接服务端,假设处理须要时间,最后就会输出订单生成成功server
php swoole_tcp_client.php # 订单生成成功
udp 服务端blog
<?php //建立Server对象,监听 127.0.0.1:9000端口,类型为SWOOLE_SOCK_UDP $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 客户端事件
<?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长链接的区别在于: TCP 的长链接须要本身去维护一套心跳策略。,而Http只须要在请求头加入keep-alive:true
便可实现长链接。