在Swoole中使用WebSocket服务器和客户端
时间:2023-03-30 04:23:16
PHP
编写前端和服务器端代码,创建前端页面并连接本地WebSocket服务器:
WebSocket发送 正文>创建HTTP服务器文件接收前端页面请求:#!/usr/bin/envphpon("请求",function(Swoole\Http\Request$request,Swoole\Http\Response$response){$response->end(file_get_contents("./index.html"));});$http->start();创建一个WebSocket服务器文件来处理前端WebSocket请求:#!/usr/bin/envphpset([//配置Task进程数'task_worker_num'=>10,//关闭Task协程支持'task_enable_coroutine'=>false]);$ws->on('open',function(Swoole\WebSocket\Server$ws,Swoole\Http\Request$request){echo'[info]newconnection,fdis'.$request->fd.PHP_EOL;$ws->push($request->fd,"你好,欢迎\n");});$ws->on('消息',function(Swoole\WebSocket\Server$ws,Swoole\WebSocket\Frame$frame){echo'[info]来自fd的新消息'.$frame->fd.PHP_EOL;$ws->push($frame->fd,"success!");$ws->task($frame->data);});$ws->on('task',function(Swoole\WebSocket\Server$ws,int$task_id,int$src_worker_id,$data){echo"[任务]新异步任务[id=$task_id]:".PHP_EOL;list($toFd,$message)=explode("",$data);//$ws->connections遍历所有websocket连接用户的fdforeach($ws->connectionsas$fd){//需要判断是否是正确的websocket连接,否则push可能失败if($fd==$toFd&&$ws->isEstablished($fd)){$ws->push($fd,$消息);}}$ws->finish("");});$ws->on('finish',function(Swoole\WebSocket\Server$ws,int$task_id,$data){echo"[task]异步任务[id=$task_id]finish".PHP_EOL;});$ws->on('close',function(Swoole\WebSocket\Server$ws,int$fd){echo'[closed]client'.$fd.'关闭'。PHP_EOL;});$ws->开始();启动相关服务启动容器和HTTP服务器:dockerrun--rm-p80:80-p8081:8081--nameswoole-v/d/swoole/www:/var/wwwphpswoole/swoole:4.5.9-php7.4进入启动WebSocket服务器的容器:dockerexecswoolebashphpws.php测试前端页面收发消息打开一个tab访问:打开另一个tab访问:从tab1发送消息到tab2:Tab2接收消息:Tab2发送消息给Tab1:Tab1接收消息:测试后台程序收发消息写一个客户端发送消息给tab1和tab2:upgrade("/");if($ret){$client->push("1hello11??1");$client->push("2hello222");$recv=json_encode($client->recv(5));echo'[info]从服务器检索数据:'.$recv.PHP_EOL;Coroutine::sleep(0.1);}});执行客户端代码:Tab1接收消息:Tab2接收消息: