本节将会讲解以下3个问题:

  • 通过Swoole如何搭建TCP服务?
  • 通过Swoole如何搭建TCP客户端?
  • 通过Swoole搭建的TCP服务,更深入理解Swoole的事件驱动模式

通过Swoole可以快速创建一个TCP服务,新建一个文件命名为 tcp_server.php,代码如下:

tcp_server.php

在命令行执行如下命令就可以开启TCP服务:

php tcp_server.php

运行完命令后就可以通过 netstat 工具查看服务是否启动成功,如果已经在监听9501端口了,这时就可以使用 telnet/netcat 工具来连接服务器了。

telnet 127.0.0.1 9501helloServer: hello

netstat工具使用方法:netstat -an | grep 9501

代码逻辑分析:

通过以上代码就可以创建一个TCP服务,监听的端口是9501。它的逻辑很简单,当客户端$socket通过网络发送一个hello字符串时,服务器端会回复一个Server:hello字符串。

Server是异步服务器,所以是通过监听事件的方式来编写程序的。当对应的事件发生时,底层会主动回调指定的函数。如当有限的TCP连接金额入时,会执行 onConnect 事件回调,当某个连接向服务器发送数据时会回调 onReceive 函数。

注意事项:

  • 服务器可以同时被成千上万个客户端连接,$fd 就是客户端连接的唯一标识符
  • Receive 事件的回调函数中 $from_id 为线程ID
  • 调用 $srver->send() 方法向客户端连接发送数据,参数就是 $fd 柯达护短标识符
  • 调用 $server->close() 方法可以强制关闭某个客户端连接
  • 客户端可能会主动断开连接,此时会触发 onClose 事件回调

无法连接到服务器的简单检测手段:

  • 在linux下,使用 netstat -an | grep 端口,查看端口是否已经被打开处于Listening状态
  • 上一步确认后,再检查防火墙问题
  • 注意服务器所用的IP地址,如果是127.0.0.1回环地址,则客户端只能使用127.0.0.1才能连接上
  • 用的阿里云服务器或者腾讯云服务器,需要在安全权限组进行设置开发的端口

TCP服务已经启动,下面我们要用Swoole搭建TCP客户端来连接TCP服务。新建一个文件,命名为 tcp_client.php,代码如下:

tcp_client.php

上面代码创建了一个TCP的同步客户端,此客户端用于连接 server.php 开启的TCP服务。向服务端发送一个 hello world 字符串,服务器会返回一个 Server:hello world 字符串。

在命令行运行如下命令就可以连接TCP服务:

php tcp_client.phpServer:hello world

这个客户端是同步阻塞的,connect/send/recv 会等待IO完成后再返回。同步阻塞操作并不消耗CPU资源。当IO操作未完成时,当前进程会自动转入 sleep 模式。当IO完成后,操作系统会唤醒当前进程,继续向下执行代码。

流程如下:

  • TCP需要进行3次握手,所以connect至少需要3次网络传输过程
  • 在发送少量数据时,$client->send 都是可以立即返回的。发送大量数据时,socket 缓冲区可能会塞满,send 操作会阻塞。
  • recv 操作会阻塞等待服务器返回数据,recv 耗时等于服务器处理时间+网络传输耗时之和。

TCP客户端还有一种异步非阻塞的实现形式。使用异步模式时,connect 会理解返回 true。但实际上连接并未建立。这时不能在 connect 后立即使用 send 发送数据,需要先通过isConnected() 判断是否连接成功。当连接成功后,系统会自动回调 onConnect 函数。这时才可以使用 send 函数向服务器发送数据。

通过上面的代码我们就实现了TCP服务端和客户端,当服务端和客户端建立TCP连接后,如何维持连接不断开呢?下面我们将介绍一下基于Swoole搭建的TCP服务器心跳维持方案。

正常情况下客户端中断TCP连接时,会发送一个FIN包,进行4次断开握手来通知服务器。但一些异常情况下,如客户端突然断电断网或者网络异常,服务器可能无法得知客户端已断开连接。尤其是移动网络,TCP连接非常不稳定,所以需要一套机制来保证服务器和客户端之间的连接的有效性。

Swoole扩展本身内置了这种机制,开发者只需要配置一个参数即可启用。Swool在每次收到客户端数据会记录一个时间戳,当客户端在一定时间内未向服务器端发送数据,那服务器会自动切断连接。

配置方法如下:

上面的设置就是每5秒侦测一次心跳,一个TCP连接如果在10秒内未向服务器发送数据,连接将会被切断。

通过以上案例我们对Swoole的事件驱动模型有了一定的了解。下面我们将详细介绍Swoole的回调事件。

事件执行顺序

  • 所有事件回调均在 $server->start 后发生
  • 服务器关闭程序终止时最后一次事件是 onShutdown
  • 服务器启动成功后,onStart /onManagerStart / onWorkerStart 会在不同的进程内并发执行
  • onReceive / onConnect / onClose 在 Worker 进程中触发
  • Worker / Task 进程启动/结束时会分别调用一次 onWorkerStart / onWorkerStop
  • onTask 事件仅在 task 进程中发生
  • onFinish 事件仅在 Worker进程中发生

事件函数介绍

  • onStart
  • onShutdown
  • onWorkerStart
  • onWorkerStop
  • onWorkerExit
  • onConnect
  • onReceive
  • onPacket
  • onClose
  • onTask
  • onFinish
  • onPipeMessage
  • onWorkerError
  • onManagerStart
  • onManagerStop

作为web开发的佼佼者PHP并不逊色其他语言,加上swoole后更加是如虎添翼!进军通信 、物联网行业开发百度地图、百度订单中心等!年后更是霸占程序员招聘语言第二名,寒冬裁员期过后正是各大企业扩大招人的时期,现在市场初级程序员泛滥,进阶中高级程序员绝对是各大企业急需的人才,这套教程适合那些1-6年的PHP开发者进阶中高级提升自己,在金九银十中找到高薪职位!

领取方式:点赞关注小编后私信【资料】获取资料领取方式!

部分资料展示:

领取方式:点赞关注小编后私信【资料】获取资料领取方式!

tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?相关推荐

  1. php swoole udp,基于Swoole如何搭建UDP服务?

    本节将会讲解如下2个问题: 通过Swoole如何搭建UPD服务?对比TCP和UDP有什么不同? 01通过Swoole如何搭建UPD服务 新建一个文件命名为 udp_server.php,代码如下: 在 ...

  2. python多线程tcp客户端_基于Python多线程的TCP客户端/服务端应用示例

    每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接. 服务端:server.py # -*- coding:utf-8 -*- import sys i ...

  3. mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  4. macos big sur安装php扩展_用PHP构建基于swoole扩展的socket服务(附PHP扩展安装步骤)...

    最近公司的一项目中,需要用PHP搭建一个socket服务. 本来PHP是不适合做服务的,因为和第三方合作,需要采用高效而稳定的TCP协议进行数据通信.经过多次尝试,最终选择了开源的PHP扩展:swoo ...

  5. mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  6. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  7. mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)

    open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖版本PHP>=7.0.0Swoole>=4.2.9Recommend ...

  8. swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池

    连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...

  9. autosar架构详细介绍_基于MATLAB环境搭建满足AUTOSAR标准的模型高级培训班

    一.课程目标 1.加深对AUTOSAR标准的认识和理解 2.能够在MATLAB平台上搭建满足AUTOSAR标准要求的应用层软件模型 3.掌握建模过程中的关键概念并能够灵活运用 4.掌握一些高级建模技巧 ...

最新文章

  1. hitchhiker部署_Hitchhiker的React Router v4指南:无限远的递归路径!
  2. opencv计算亮度
  3. 【推荐系统】深入理解YouTube推荐系统算法
  4. RTSP服务器实例live555源代码分析
  5. windows屏蔽USB接口的脚本
  6. 作业二:个人博客作业内容:需求分析
  7. 职业发展 先“立功”还是先“安内”?
  8. ug冲模标准件库_昆山兴模lt;携手gt;武汉益模,打通冲模“智能设计+精益管理”的最后一道关卡...
  9. PHP常见缓存技术分析(cache)
  10. Hibernate的出现和Hinbernate的简单模拟实现
  11. 0x08标志类型的RTMPE、RTMPTE协议分析
  12. Jetson TK1 一:调整屏幕分辨率
  13. JavaScript 资源列表
  14. 二分查找在java中的实现
  15. 下软件,就靠这几个网站
  16. HDU - 5977 Garden of Eden (树形dp+容斥)
  17. 单片机通过串口与电脑通信
  18. java爬虫爬取豆瓣电影_小爬虫之爬取豆瓣电影排行榜
  19. 如何安装百度分享按钮
  20. python scatter设置随机颜色_python – Matplotlib Scatter plot根据列表中的值更改颜色...

热门文章

  1. LeetCode 542. 01 矩阵(BFS DP)
  2. 大数据应用项目创新大赛_全国高校大数据应用创新大赛
  3. 处理器指令编码可重定义的方法_从零开始设计四位栈处理器(2)——结构与指令集...
  4. InfluxDB安装及使用
  5. Log4j框架配置文件
  6. Android显存到内存拷贝耗时,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升...
  7. java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别
  8. 日志级别动态调整——小工具解决大问题
  9. 美团点评技术年货:900+页电子书,覆盖前端、后台、大数据、算法……
  10. 国科大prml12-半监督学习