Workerman UDP怎么做客户端通信

冬枫同学_7570

冬枫同学_7570

2026-09-06

631人浏览

原创

udpconnection 不能用作客户端,因其仅为框架内部入站连接句柄且构造函数私有;需用 php 原生 socket 或 stream_socket_client 实现 udp 客户端通信,并注意超时设置与非阻塞处理以避免阻塞 workerman 进程。

workerman udp怎么做客户端通信

UdpConnection 本身不提供「客户端连接」语义,Workerman 的 UDP Worker 默认是服务端角色 —— 它监听端口、接收任意来源的 UDP 数据包,并通过 $connection->send() 回复。真要模拟“客户端行为”,得绕开 Worker 的连接管理,直接用 PHP 原生 socket。


为什么不能直接 new UdpConnection 当客户端

UdpConnection 是 Workerman 内部封装的「入站连接句柄」,只在 onMessage 回调中由框架自动创建并传入。它没有构造函数对外暴露,也不支持主动绑定远端地址或发起 sendto。试图手动实例化会报 Fatal error: Uncaught Error: Call to private UdpConnection::__construct()


用 PHP 原生 socket 发起 UDP 请求

这是最轻量、最可控的方式,适合发心跳、查状态、对接第三方 SIP/GB28181 设备等场景:

  • socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) 创建 socket
  • socket_sendto() 直接向目标 IP:Port 发包,无需 connect
  • socket_recvfrom() 接收响应(注意设超时,避免阻塞)
  • 记得 socket_close(),尤其在常驻进程里反复调用时防 fd 泄漏

示例片段:

绘蛙AI视频
绘蛙AI视频

绘蛙AI视频是一款面向电商营销的图片转视频和模特动态视频生成工具。

下载
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 1, 'usec' => 0]);
socket_sendto($sock, $data, strlen($data), 0, '192.168.1.100', 5060);
$len = socket_recvfrom($sock, $buf, 2048, 0, $ip, $port);
socket_close($sock);

在 Workerman 进程里安全调用原生 socket

Workerman 的 event loop(ReactPHP 或 libevent)和原生 blocking socket 冲突。直接在 onMessage 里用 socket_recvfrom 会卡住整个进程。必须满足:

  • 只用于「发包 + 等少量响应」,且严格控制超时(如上面的 SO_RCVTIMEO
  • 避免在高并发 onMessage 中频繁创建/销毁 socket,可考虑复用 socket 资源池
  • 若需异步等待响应,应改用 Worker::$globalEvent->add() 注册可读事件,配合非阻塞 socket
  • 不要在定时器(Timer::add)里裸写 blocking recv,容易堆积

替代方案:用 stream_socket_client 模拟 UDP 客户端

PHP 的 stream_socket_client('udp://host:port', ...) 可以返回一个 stream resource,配合 stream_socket_sendto()stream_select() 实现非阻塞收发。但要注意:

  • 它底层仍调用系统 socket,行为与原生 socket 一致
  • stream_socket_client 的 UDP 模式不建立连接,只是方便封装
  • 无法像 TCP 那样用 fwrite/fread,必须用 stream_socket_sendto 显式指定地址
  • 错误处理更松散,比如目标不可达时可能静默失败,需检查返回值

实际用起来比原生 socket 少几行代码,但可控性略低。对简单探测类请求够用。


UDP 客户端通信在 Workerman 里本质是「借壳执行」,框架不托管生命周期。最容易踩的坑是忘记设 recv 超时,或者在 event loop 里混用 blocking IO —— 这会导致整个 Worker 进程假死。真正需要高频双向交互的场景(比如 GB28181 心跳保活),建议把客户端逻辑抽成独立子进程,或改用 Swoole 的 Co\Socket

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.25

423

5

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

2023.08.08

2231

5

tcp和udp有什么区别
tcp和udp有什么区别

tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。想了解更多tcp相关的内容,可阅读本专题下面的相关文章。

2024.11.14

2589

8

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

146

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

162

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

127

13

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

0

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

0

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习