WebSocket 服务
WebSocket
是一种在单个 TCP
连接上进行全双工通信的协议。WebSocket
使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket
中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
主服务
可以将 WebSocket
服务作为 EasySwoole
的主服务。
首先修改配置文件 MAIN_SERVER.SERVER_TYPE
配置项为 EASYSWOOLE_WEB_SOCKET_SERVER
。
然后在 EasySwooleEvent
中的 mainServerCreate 事件注册回调,参考示例如下:
<?php
namespace EasySwoole\EasySwoole;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use Swoole\WebSocket\Server as SwooleWebSocketServer;
use Swoole\Http\Request as SwooleHttpRequest;
use Swoole\WebSocket\Frame;
use Swoole\Server as SwooleServer;
class EasySwooleEvent implements Event
{
// ...
public static function mainServerCreate(EventRegister $register)
{
$register->set($register::onOpen, function (SwooleWebSocketServer $server, SwooleHttpRequest $request) {
var_dump($request->fd, $request->server);
$server->push($request->fd, "hello, welcome\n");
});
$register->set($register::onMessage, function (SwooleWebSocketServer $server, Frame $frame) {
echo "Message: {$frame->data}\n";
$server->push($frame->fd, "server: {$frame->data}");
});
$register->set($register::onClose, function (SwooleServer $server, int $fd) {
echo "client-{$fd} is closed\n";
});
}
}
子服务
可以将 WebSocket
服务作为 EasySwoole
的子服务
如果想要将 WebSocket
作为 EasySwoole 的子服务,则主服务必须也为 WebSocket
服务类型。
然后开另外一个端口进行 WebSocket
监听。
在 EasySwooleEvent
中的 mainServerCreate 事件中进行子服务监听,参考代码如下:
<?php
namespace EasySwoole\EasySwoole;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use Swoole\WebSocket\Server as SwooleWebSocketServer;
use Swoole\Http\Request as SwooleHttpRequest;
use Swoole\WebSocket\Frame;
use Swoole\Server as SwooleServer;
class EasySwooleEvent implements Event
{
// ...
public static function mainServerCreate(EventRegister $register)
{
// ....
$server = ServerManager::getInstance()->getSwooleServer();
$subPort = $server->addlistener('0.0.0.0', 9502, SWOOLE_TCP);
$subPort->set(['open_websocket_protocol' => true]);
$subPort->on($register::onOpen, function (SwooleWebSocketServer $server, SwooleHttpRequest $request) {
var_dump($request->fd, $request->server);
$server->push($request->fd, "hello, welcome\n");
});
$subPort->on($register::onMessage, function (SwooleWebSocketServer $server, Frame $frame) {
echo "Message: {$frame->data}\n";
$server->push($frame->fd, "server: {$frame->data}");
});
$subPort->on($register::onClose, function (SwooleServer $server, int $fd) {
echo "client-{$fd} is closed\n";
});
}
}