clue / multicast-react
为ReactPHP提供的简单、事件驱动的多播UDP消息客户端和服务器。
Requires
- php: >=5.3
- react/datagram: ~1.0
- react/event-loop: ^1.2
Requires (Dev)
- clue/hexdump: 0.2.*
- phpunit/phpunit: ^9.6 ||^6.0 || ^5.7 || ^4.8.36
Suggests
- ext-sockets: Requires PHP 5.4+ and the low level socket API for listening on multicast addresses (socket options to send IGMP announcements)
README
为ReactPHP提供的简单、事件驱动的多播UDP消息客户端和服务器。
多播UDP消息对于许多(低级)网络协议都是必需的。其中,多播网络是mDNS(多播DNS)、HTTPMU(多播UDP HTTP消息)、UPnP/SSDP(通用即插即用/简单服务发现协议)等协议的基础。这个库通过一个易于使用的API,公开了多播网络中常用功能的一个简单子集。
目录
支持我们
我们投入大量时间开发、维护和更新我们出色的开源项目。您可以通过成为GitHub赞助商来帮助我们保持这种高质量的工作。赞助商将获得许多好处,请参阅我们的赞助页面以获取详细信息。
让我们一起将这些项目提升到下一个层次!🚀
快速入门示例
安装后,您可以使用以下代码创建一个简单的回声服务器,该服务器侦听传入的多播消息
<?php require __DIR__ . '/vendor/autoload.php'; $factory = new Clue\React\Multicast\Factory(); $socket = $factory->createReceiver('224.10.20.30:4050'); $socket->on('message', function ($data, $remote) use ($socket) { echo 'Sending back ' . strlen($data) . ' bytes to ' . $remote . PHP_EOL; $socket->send($data, $remote); });
另请参阅示例。
使用方法
工厂
Factory
负责创建您的SocketInterface
实例。
$factory = new Clue\React\Multicast\Factory();
此类接受一个可选的LoopInterface|null $loop
参数,可以用来传递用于此对象的事件循环实例。您可以使用null
值,以便使用默认循环。除非您确定要显式使用给定的事件循环实例,否则不应提供此值。
createSender()
createSender(): SocketInterface
方法可以用来创建一个可以发送外出多播数据报和接收传入单播响应的套接字。它返回一个SocketInterface
实例。
$socket = $factory->createSender(); // send a multicast message to everybody listening on the given address $socket->send('hello?', '224.10.20.30:4050'); // report incoming unicast replies $socket->on('message', function ($data, $address) { echo 'received ' . strlen($data) . ' bytes from ' . $address . PHP_EOL; });
此方法在PHP 5.3(及更高版本)上工作,因为其套接字API始终是1级多播符合。
createReceiver()
createReceiver(string $address): SocketInterface
方法可以用来创建一个可以接收传入多播数据报并发送外出单播或多播数据报的套接字。它返回一个SocketInterface
实例。
$socket = $factory->createReceiver('224.10.20.30:4050'); // report incoming multicast messages $socket->on('message', function ($data, $remote) use ($socket) { echo 'Sending back ' . strlen($data) . ' bytes to ' . $remote . PHP_EOL; // send a unicast reply to the remote $socket->send($data, $remote); });
此方法需要PHP 5.4+和ext-sockets
。否则,它将抛出BadMethodCallException
异常。这是因为接收多播数据包需要第二层多播兼容的套接字API。PHP 5.4+已添加所需的组播套接字选项和常量。这些选项仅适用于低级套接字API(ext-sockets),而不是较新的基于流的网络API。
内部,该库使用一个绕过方法来创建基于流的套接字,然后在其底层低级套接字资源上设置所需的套接字选项。这样做是因为ReactPHP是围绕通用基于流的API构建的,并且对低级套接字API的支持有限。
SocketInterface
Factory
从react/datagram包创建React\Datagram\SocketInterface
的实例。这意味着您可以使用所有正常方法,如下所示
$socket->send($message, $address); $socket->on('message', function ($message, $address) { }); $socket->on('close', function() { }); $socket->pause(); $socket->resume(); $socket->end(); $socket->close();
有关更多详细信息,请参阅数据报文档。
安装
推荐通过Composer安装此库。您是Composer的新手吗?不了解Composer?
此项目遵循SemVer。这将安装最新的支持版本
composer require clue/multicast-react:^1.2
有关版本升级的详细信息,请参阅变更日志。
此项目旨在在所有平台上运行,因此不需要任何PHP扩展,并支持在当前PHP 8+和HHVM上运行,以及通过PHP 5.3的旧版本。强烈建议使用此项目的最新支持版本。
createSender()
方法在所有支持的平台上无需额外要求即可运行。但是,createReceiver()
方法需要PHP 5.4(或更高版本)和ext-sockets
。有关更多详细信息,请参阅上文。
测试
要运行测试套件,您首先需要克隆此仓库,然后通过Composer安装所有依赖项
composer install
要运行测试套件,请转到项目根目录并运行
php vendor/bin/phpunit
许可证
此项目采用宽松的MIT许可。
您知道我可以提供定制开发服务、发布赞助和贡献的发票吗?有关详细信息,请联系我(@clue)。