12、Swoole 中 TCP、UDP 和长连接、短连接

TCP 服务

swoole 文档 - TCP 服务

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 端口。

然后先启动服务,然后再通过 telnet 命令去连接试试


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 客户端


<?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 客户端去连接服务端,假设处理需要时间,最后就会输出订单生成成功


php swoole_tcp_client.php

# 订单生成成功

UDP 服务

swoole 文档 - UDP 服务

udp 服务端


<?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长连接的区别

Http长连接 和 TCP长连接的区别在于: TCP 的长连接需要自己去维护一套心跳策略。,而Http只需要在请求头加入keep-alive:true即可实现长连接。

本作品采用《CC 协议》,转载必须注明作者和本文链接
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 文章来源blog.arunfung.com
arunfung
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!