您现在的位置是:技术博客 > PHPPHP Swoole Lucas2020-09-20 19:11【代码】563人已围观 简介通过官方给出的TCP、UDP、HTTP代码和自己编写的代码来一起了解swoole。 #### 四、官方给出的TCP服务器的代码示例 1、server.php ``` <?php //创建Server对象,监听 127.0.0.1:9501 端口 $server = new Swoole\Server('127.0.0.1', 9501); //监听连接进入事件 $server->on('Connect', function ($server, $fd) { echo "Client: Connect.\n"; }); //监听数据接收事件 $server->on('Receive', function ($server, $fd, $from_id, $data) { $server->send($fd, "Server: " . $data); }); //监听连接关闭事件 $server->on('Close', function ($server, $fd) { echo "Client: Close.\n"; }); //启动服务器 $server->start(); ``` 2、通过CLI模式调用server.php文件 ``` php server.php ``` 3、查看端口 ``` # 查看端口号是否已使用 netstat -anp | grep 9501 tcp 0 0 127.0.0.1:9501 0.0.0.0:* LISTEN 2535/php tcp 0 0 127.0.0.1:9501 127.0.0.1:46544 CLOSE_WAIT 2535/php # 杀死进程,上面的例子pid=`2535` kill -9 pid ``` 4、安装netcat(网络工具中有“瑞士军刀”美誉) ``` yum install -y nc ``` 5、安装telnet ``` yum list telnet* 列出telnet相关的安装包 yum install telnet-server 安装telnet服务 yum install telnet.* 安装telnet客户端 ``` 6、调用telnet工具 ``` telnet 127.0.0.1 9501 # 提示:按 Ctrl + ] 键调出telnet的命令行,quit退出 hello Server: hello ``` #### 五、小试牛刀地写一个TCP服务器代码示例 1、server.php ``` <?php //创建服务器对象 $host = "0.0.0.0";//服务器主机地址,0.0.0.0表示所有客户端都能连接。 $port = 9509;//监听端口 $mode = SWOOLE_PROCESS;//服务器运行模式,默认多进程 $sock_type = SWOOLE_SOCK_TCP;//服务器套接字类型,默认TCP $server = new swoole_server($host, $port, $mode, $sock_type); //设置服务器运行时参数 $config = []; $config["worker_num"] = 4;//设置启动的Worker进程数量 $config["daemon"] = false;//设置守护进程化 $server->set($config); //注册事件回调函数 //Master进程 监听启动事件 $server->on("Start", function(swoole_server $server){ try{ $master_pid = $server->master_pid;//获取Master主进程的PID $manager_pid = $server->manager_pid;//获取Manager管理进程的PID echo "[start] master {$master_pid} manager {$manager_pid}".PHP_EOL; }catch(Exception $e){ echo "[start] exception"; } }); //Worker进程 监听连接进入事件 $server->on("Connect", function(swoole_server $server, $fd, $reactor_id){ $worker_pid = $server->worker_pid; echo "[connect] worker {$worker_pid} reactor {$reactor_id} client {$fd}: connect".PHP_EOL; }); //Worker进程 监听数据接收事件 $server->on("Receive", function(swoole_server $server, $fd, $reactor_id, $data){ $worker_pid = $server->worker_pid; echo "[receive] worker {$worker_pid} reactor {$reactor_id} client {$fd}: {$data}".PHP_EOL; //向客户端发送消息 $message = "welcome"; $server->send($fd, $message); }); //Worker进程 监听连接关闭事件 $server->on("Close", function(swoole_server $server, $fd, $reactor_id){ echo "[close] reactor {$reactor_id} client {$fd}: close".PHP_EOL; }); //启动服务器 $server->start(); ``` 2、client.php ``` <?php $client = new swoole_client(SWOOLE_SOCK_TCP); if(!$client->connect("127.0.0.1",9509)){ echo "连接失败"; exit; } //php cli常量 fwrite(STDOUT,"请输入消息:"); $msg = trim(fgets(STDIN)); //发送消息给tcp server服务器 $client->send($msg); //接受来自server的数据 $result = $client->recv(); echo $result; ``` 3、分别调用server.php和client.php, ``` php server.php php client.php ``` 4、效果图  #### 一、HTTP 服务器示例代码 http_server.php ``` <?php $http = new Swoole\Http\Server('0.0.0.0', 9501); $http->on('request', function ($request, $response) { var_dump($request->server); $response->header("Content-Type", "text/html; charset=utf-8"); $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>"); }); $http->start(); ``` <p style="color:#7d8b8d">HTTP 服务器只需要关注请求响应即可,所以只需要监听一个 onRequest 事件。当有新的 HTTP 请求进入就会触发此事件。事件回调函数有 2 个参数,一个是 $request 对象,包含了请求的相关信息,如 GET/POST 请求的数据。 另外一个是 response 对象,对 request 的响应可以通过操作 response 对象来完成。$response->end() 方法表示输出一段 HTML 内容,并结束此请求。 0.0.0.0 表示监听所有 IP 地址,一台服务器可能同时有多个 IP,如 127.0.0.1 本地回环 IP、192.168.1.100 局域网 IP、210.127.20.2 外网 IP,这里也可以单独指定监听一个 IP 9501 监听的端口,如果被占用程序会抛出致命错误,中断执行。</p> 启动服务 ``` php http_server.php ``` 浏览器外网访问 : `http://111.xxx.xxx.64:9501` #### 二、UDP 服务器示例代码 udp_server.php ``` <?php $server = new Swoole\Server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //监听数据接收事件 $server->on('Packet', function ($server, $data, $clientInfo) { var_dump($clientInfo); $server->sendto($clientInfo['address'], $clientInfo['port'], 'Server:' . $data); }); //启动服务器 $server->start(); ``` <p style="color:#7d8b8d">UDP 服务器与 TCP 服务器不同,UDP 没有连接的概念。启动 Server 后,客户端无需 Connect,直接可以向 Server 监听的 9502 端口发送数据包。对应的事件为 onPacket。$clientInfo 是客户端的相关信息,是一个数组,有客户端的 IP 和端口等内容调用 $server->sendto 方法向客户端发送数据</p> 启动服务 ``` php udp_server.php ``` UDP 服务器可以使用 nc -u 来连接测试 ``` nc -u 127.0.0.1 9502 hello Server: hello ``` #### 三、WebSocket 服务器 web_server.php ``` <?php //创建WebSocket Server对象,监听0.0.0.0:9502端口 $ws = new Swoole\WebSocket\Server('0.0.0.0', 9503); //监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->server); $ws->push($request->fd, "hello, welcome\n"); }); //监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $ws->push($frame->fd, "server: {$frame->data}"); }); //监听WebSocket连接关闭事件 $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start(); ``` 启动服务 ``` php web_server.php ``` 浏览器访问 ``` <!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> <script type="text/javascript"> var wsServer = 'ws://111.231.194.64:9503'; var websocket = new WebSocket(wsServer); websocket.onopen = function (evt) { console.log("Connected to WebSocket server."); }; websocket.onclose = function (evt) { console.log("Disconnected"); }; websocket.onmessage = function (evt) { console.log('Retrieved data from server: ' + evt.data); }; websocket.onerror = function (evt, e) { console.log('Error occured: ' + evt.data); }; </script> </html> ``` 效果图如下:  转载:感谢您对Lucas个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源Lucas个人博客”。 很赞哦! ( 0 ) 上一篇:Swoole 基础篇六(异步TASK) 下一篇:笔试题 相关文章 高并发库存防控超量 Swoole 基础篇一(初识) Sublime代码格式化 Session与Cookie 点击排行 生活不止眼前的苟且,还有诗和远方 十年一觉电影梦 奥地利基茨比厄尔 禅修治愈身心 自律成就自我 零边际成本社会 Modern PHP 鸟哥的Linux私房菜 本栏推荐 要技术,更要有创意 定时任务 Curl无法发送https请求 Lnmp环境搭建 常用的SQL函数 Windows的cmd指令 ueditor工具栏浮动bug 有趣的js插件 标签云 git laravel swoole javascript vue ajax html css sql linux docker flask django nginx apache thinkphp markdown sublime wechat layui photoshop nodejs mysql windows composer java maven springboot mybatis IDE 猜你喜欢 Swoole 基础篇一(初识) PHP进程管理器 正则的快速上手 Sublime代码格式化 Lnmp环境搭建 高并发库存防控超量 Linux之top命令 常用的SQL函数 站点信息 建站时间:2018-05-01 在线人数:1人 文章统计:263篇 总浏览量:222673次 统计数据:百度统计 个人信息:扫描二维码查看