swoole实现WebSocket服务器基础案例_飞蛾逐月的博客-CSDN博客


本站和网页 https://blog.csdn.net/zhou16333/article/details/99022410 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

swoole实现WebSocket服务器基础案例_飞蛾逐月的博客-CSDN博客
swoole实现WebSocket服务器基础案例
飞蛾逐月
于 2019-08-10 11:21:18 发布
1631
收藏
分类专栏:
PHP
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhou16333/article/details/99022410
版权
PHP
专栏收录该内容
5 篇文章
0 订阅
订阅专栏
文章目录
环境准备参数说明服务端脚本客户端脚本运行效果服务端检测脚本参考文献
环境准备
虚拟机
VirtualBox
服务端
OS:CentOS 7IP:192.168.55.171PHP:PHP 7.3.0(已安装swoole 4.4.0扩展)域名:sy.net
客户端
OS:Windows 10IP:192.168.55.1hosts:192.168.55.171 sy.net
swoole 4.4.0下载:http://swoole-1252906962.cos.ap-shanghai.myqcloud.com/linuxglibc/4.4.0/swoole_4.4.0_163f39b9_x86-64.tar.xz
参数说明
服务端
new swoole_websocket_server()swoole_websocket_server继承自swoole_http_serveron/start函数open/message/closepush()发送数据
服务端脚本
/wwwroot/sy.net/socket/ws_server.php
<?php
//创建WebSocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server('0.0.0.0', 9502);//客户端链接成功
//$ws = new swoole_websocket_server("192.168.55.171", 9502);//客户端链接成功
//$ws = new swoole_websocket_server("127.0.0.1", 9502);//客户端链接失败
//监听WebSocket链接打开事件
$ws->on('open', function ($ws, $request) {
//var_dump($request->fd, $request->get, $request->server);
print_r($request);
$ws->push($request->fd, "hello, welcome");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
//echo "Message: {$frame->data}\n";
print_r($frame);
$ws->push($frame->fd, "server: {$frame->data}");
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
//删除已断开的客户端
unset($ws->user_c[$fd-1]);
});
$ws->start();
启动服务 /application/php/bin/php /wwwroot/sy.net/socket/ws_server.php
启动服务,后台运行,且屏幕不输出 /application/php/bin/php /wwwroot/sy.net/socket/ws_server.php > /dev/null &
查看服务是否启动
[root@sy-pc ~]# netstat -lntup|grep 9502
tcp 0 0 0.0.0.0:9502 0.0.0.0:* LISTEN 6859/php
客户端脚本
/wwwroot/sy.net/socket/ws_client.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<button type="button" onclick="sendMessage()">发送数据</button>
<button type="button" onclick="closeConnect()">断开链接</button>
<button type="button" onclick="againConnect()">手动重连</button>
</body>
<script>
var msg = document.getElementById("msg");
//var wsServer = 'ws://192.168.55.171:9502';
var wsServer = 'ws://sy.net:9502';//如果客户端配置了hosts文件,则可以使用域名
var websocket = null;
function firstConnect() {
websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
//websocket.readyState 属性:
/*
CONNECTING 0 The connection is not yet open.
OPEN 1 The connection is open and ready to communicate.
CLOSING 2 The connection is in the process of closing.
CLOSED 3 The connection is closed or couldn't be opened.
*/
msg.innerHTML = websocket.readyState;
console.log("Connected to WebSocket server.");
};
websocket.onclose = function (evt) {
msg.innerHTML += 'Disconnected<br>';
console.log("Disconnected");
};
websocket.onmessage = function (evt) {
msg.innerHTML += evt.data + '<br>';
console.log('Retrieved data from server: ' + evt.data);
};
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};
firstConnect();
function sendMessage() {
ipttext = document.getElementById('text')
var text = ipttext.value;
ipttext.value = '';
if (websocket.readyState != 1) {
msg.innerHTML += 'WebSocket is closed.<br>';
return false;
websocket.send(text);
function closeConnect() {
websocket.close();
//WebSocket断开重连
function againConnect() {
if (websocket.readyState != 1) {
firstConnect();
//setInterval(againConnect, 5000);
</script>
</html>
运行效果
浏览器http://192.168.55.171:9501,得到 HTTP 400 Bad Request Powered by Swoole
测试1:WebSocket链接
浏览器http://sy.net/socket/index.html?t=123
服务器端控制台输出
Swoole\Http\Request Object
[fd] => 1
[streamId] => 0
[header] => Array
[host] => sy.net:9502
[connection] => Upgrade
[pragma] => no-cache
[cache-control] => no-cache
[user-agent] => Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
[upgrade] => websocket
[origin] => http://sy.net
[sec-websocket-version] => 13
[accept-encoding] => gzip, deflate
[accept-language] => zh-CN,zh;q=0.9,en;q=0.8
[sec-websocket-key] => +Hyrt1z8IWYzyWLAkRI13g==
[sec-websocket-extensions] => permessage-deflate; client_max_window_bits
[server] => Array
[request_method] => GET
[request_uri] => /
[path_info] => /
[request_time] => 1565422354
[request_time_float] => 1565422354.8778
[server_protocol] => HTTP/1.1
[server_port] => 9502
[remote_port] => 15980
[remote_addr] => 192.168.55.1
[master_time] => 1565422354
[request] =>
[cookie] =>
[get] =>
[files] =>
[post] =>
[tmpfiles] =>
测试2:客户端发送信息
客户端发送数据{"type":"eat","data":{}} 服务端控制台输出:
Swoole\WebSocket\Frame Object
[fd] => 1
[data] => {"type":"eat","data":{}}
[opcode] => 1
[finish] => 1
对应服务端代码print_r($frame);语句输出内容。
测试3:服务端停止服务
服务端停止socket服务,则客户端触发JS中的websocket.onclose = ......代码。
测试4:客户端断开WebSocket链接
客户端点击断开链接按钮,则服务端控制台显示:
client-1 is closed
服务端检测脚本
可以参考 shell监控PHP守护进程[DB|OL] https://blog.csdn.net/zhou16333/article/details/98531445 。
获得守护进程PID的shell语句: ps -aux | grep ws_server.php | grep -v grep | head -1 | awk '{print $2}' netstat -lntup | grep 9502 | awk '{print $7}' | awk -F / '{print $1}'
参考文献
[1] 官网[DB|OL]. https://wiki.swoole.com/wiki/page/479.html . [2] 利用Swoole实现PHP+websocket 聊天室[DB|OL]. https://www.jianshu.com/p/fedbb9d2d999 .
飞蛾逐月
关注
关注
点赞
收藏
打赏
评论
swoole实现WebSocket服务器基础案例
文章目录环境准备参数说明服务端脚本客户端脚本运行效果参考文献环境准备服务端OS:CentOS 7IP:192.168.55.171PHP:PHP 7.3.0(已安装swoole扩展)域名:sy.net客户端OS:Windows 10IP:192.168.55.1参数说明服务端new swoole_websocket_server()swoole_websocke...
复制链接
扫一扫
专栏目录
从此不求人:自主开发Swoole http框架(第一季)
05-24
<p>
本课程是基于Swoole 4.x的实战课程
</p>
<p>
目前市面上基于Swoole的框架很多,学习难度各有高低。因此本课程从Swoole 框架基础入手
</p>
<p>
讲解下如何开始自主开发一个http 框架。
</p>
<p>
<br />
</p>
<p>
由于本课程课时较多,因此分多季节放出。第一季主要讲的是IoC容器、注解等基本使用
</p>
<p>
并实现自己的Bean工厂。和框架的最基本运行方式
</p>
<p>
<br />
</p>
<p>
第二季<strong><span style="color:#E53333;">正在录制中</span></strong>,届时会包含框架启动命令支持、修改代码热更新、ORM等功能
</p>
<p>
第三季包含AOP等功能、秒杀场景等 (本课程<span style="color:#E53333;"><strong>不包含</strong></span>秒杀场景)
</p>
<p>
第四季包含RPC等功能。敬请期待。
</p>
<p>
本课程非基础课程,适合有一定PHP开发基础、了解Swoole最基本的代码基础、能够自行搭建Linux开发环境、了解composer等操作
</p>
<p>
本课程代码编写环境是phpstorm+windows
</p>
<p>
运行环境是Linux+docker
</p>
Swoole:【Swoole从入门到实战】学习笔记,从零开始学Swoole,包括Swoole Task,Swoole WebSocket,Swoole HTTP服务,Swoole RPC服务,Swoole MySQL连接池,Swoole Redis连接池,Swoole压测等,其中7个字节分享,11篇文章总结文章分享
03-22
项目介绍
项目地址: :
Swoole入门的学习笔记,从零开始学Swoole。
持续更新...
项目结构
├─ Swoole
│ ├─ 1.Swoole 启动一个服务,开启了哪些进程和线程?
│ ├─ 2.Swoole Timer 的应用
│ ├─ 3.Swoole Task 的应用
│ ├─ 4.Swoole WebSocket 的应用
│ ├─ 5.Swoole HTTP 的应用
│ ├─ 6.Swoole 多协议、多端口的应用
│ ├─ 7.Swoole 整合成一个小框架
│ ├─ 8.Swoole RPC 的实现
│ ├─ 9.Swoole MySQL 连接池的实现
│ ├─ 10.Swoole Redis 连接池的实现
│ ├─ 11.压测 swoole_websocket_server 性能
如果您发现本项目有内容上的错误,欢迎提交问题进行指正。
参与评论
您还未登录,请先
登录
后发表或查看评论
Swoole WebSocket
JunChow
06-06
203
什么是WebSocket呢?
WebSocket是HTML5新增的一种通信协议,目标主流的浏览器都支持这个协议,比如Google的Chrome、Apple的Safari、Mozala的Firefox、Microsoft的IE等。对WebSocket协议支持最早的当属Chrome浏览器,从Chrome12开始就已经开始支持,随着协议草案不断完善,各个浏览器对协议的实现也在不停的更新。...
基于 Swoole 搭建 WebSocket 服务详解
最新发布
CRMEB小程序商城的博客
09-26
705
Swoole 支持用于构建各种服务器,包括 HTTP 服务器、websocket 服务器、tcp 服务器、redis 服务器等等。我们在这里使用 websocket 服务器。
Swoole基础知识,安装,websocket应用及各种问题详解
weixin_41380972的博客
07-10
2446
1. swoole基础-概述
Swoole基础课程正式推出!零基础开始,让你循环渐进的掌握swoole。
传统的phper们大部分都是用于开发web应用程序,并且大部分都是在用类似yii\laravel\tp等框架进行开发。
但是phper们在面对比如即时通讯、长连接等问题的时候就显得力不从心了。
过去几年,Swoole完全颠覆了PHP,成为phper们必会且提升自我的一种技能。
那么问...
swoole 4.5.2 post 请求 body 为空 404
FengHongSeXiaoXiang的博客
08-03
456
<html><body><h2>HTTP 404 Not Found</h2><hr><i>Powered by Swoole</i></body></html>
解决办法:
切换到 对应目录
/**/config/autoload/server.php
Swoole WebSocket服务
wgchen
08-10
91
swoole什么是websockt?Swoole WebSocket服务服务端示例前端示例应用1 运行程序2 预览3 代码优化
什么是websockt?
websocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信—— 允许服务器主动发送信息给客户端。
为什么需要websocket
缺陷:HTTP的同学只能有客户端发起
WebSocket 特点
建立在TCP协议之上
性能开销小通信高效
客户端可以与任意服务器通信
协议标识符ws wss
持久化网络通信协议
Swoole Websocket应用简单例子
m0_37634311的博客
02-16
1019
本例子基于Yii2。
Websock服务端:
$server = new \swoole_websocket_server("0.0.0.0", 8001);
$server->set([
'task_worker_num' => 1,
]);
$server->on('Open', function ($server, $req) {
echo "连接服务器: {$req->fd}\n";
});
$server->on('Message', func...
【Swoole系列2.4】WebSocket服务
硬核项目经理
07-14
182
WebSocket服务对于 Web 应用来说,最主流的当然就是我们之前学习过的 Http、TCP、UDP 这一类的应用。但是,最近这些年,特别是 HTML5 成为主流之后,WebSocket 应用日益丰富起来。要知道,之前我们在做后台时,如果要做消息通知之类的应用,全都是使用 JQuery 来进行 Ajax 轮询的。对于后台来说,这么做问题不大,但是如果你是要在前端页面做...
swoole-WebSocket服务
MrWangisgoodboy的博客
07-27
323
swoole-WebSocket服务
swoole websocket 简单示例
tuzhichao的专栏
09-04
1216
请确保服务器已安装配置好swoole
1. 服务端 ws.php
<?php
$server = new swoole_websocket_server("0.0.0.0", 9501);
$server->on('open', function (swoole_websocket_server $server, $request) {
echo "server...
php swoole实例,Swoole WebSocket实例
weixin_36219894的博客
03-16
173
Swoole WebSocket实例SwooleWebSocket介绍swoole-1.7.9 增加了内置的websocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器。常见使用场景:我们在使用php开发的时候,原生最不好用的是socket类库了,而在开发IM和及时通信项目是,我们现在有了新的选择后端使用phpSwoole WebSocket + 前...
php swoole构建webSocket连接的简单实例
落白
09-20
2904
1.客户端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>webSocket</title>
</head>
<body>
&amp
swoole中对websocket的理解
一只不正经的程序猿的博客
05-16
1525
我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终端的情况下,都可以完美的和服务端兼容。这样就轻松实现了MVC各个部分的真正解耦。但是提高程序的友好性还是有很多路要走,其中一个大家都会遇到的就是数据实时更新的问题。比如一个用户在手机上做了添加操作,这时候其他的终端也应该及时显示数据的变化情况。这个对于手机来说还算好办,因为现在的各种推送服务完全可以满足...
swoole 的websocket 连接
xiao199306的博客
09-11
5684
小编也是刚接触swoole,官方文档给swoole demo信息量也非常的少,有些地方也没有说清楚,折腾了一,两天websocket终于握手成功,写下我的心得,希望能给有需要的人一些帮助。
首先我先介绍我的运行环境是直接放在外网服务器的,程序运行环境我就不多说了大家可以参考swoole官网,我是直接通过ip 进行访问的,在这其中小编遇到一个坑,那就是我们让htpp服务器或者websocket监听...
swoole websocket聊天
12-27
swoole websocket聊天
swoole-websocket
weixin_44320900的博客
11-13
99
websocket
打开官网,我们看到
需要注意的是,其中的回调函数open与close不是填的,但是message这个回调方法是必须实现的,我们拿到上面的代码,直接复制,在/study 目录下新建一个websocket.php 文件
我们继续在/study 目录下新建一个websocket.html文件,开始撰写相关的前端代码
在上面的demo中,相关的js代码可以在websocket的资料...
swoole实现websocket长连接,Timer定时器
Luke
06-13
6336
swoole
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端/客户端。
Swoole底层内置了异步非阻塞、多线程...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
飞蛾逐月
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
58
原创
1万+
周排名
1万+
总排名
17万+
访问
等级
2100
积分
32
粉丝
66
获赞
23
评论
349
收藏
私信
关注
热门文章
Mysql:如果数据存在则更新,不存在则插入
33741
数据结构C-二叉树的二叉链表存储表示
11636
PHP自动加载 spl_autoload_register
6904
输入输出重定向的符号及其作用
6348
shell 函数
5081
分类专栏
前端
7篇
音乐
1篇
笔记
2篇
Linux
24篇
PHP环境
15篇
PHP
5篇
Nginx
9篇
MySQL
10篇
Python
4篇
设计模式
HK(Web技术实战篇)
行为习惯
数据结构
8篇
数学
搜索引擎
1篇
Redis
2篇
最新评论
Mysql:如果数据存在则更新,不存在则插入
luojineng000:
感谢博主的方案,请问博主有没有对比哪种效率更高呢?
Mysql:如果数据存在则更新,不存在则插入
哦№我的天:
有个问题,如果是update一条新数据,如下
| id | num | name | company | job | tel | mobile |mail |
| 2 | 1001 | 小李 |小张科技| | | | |
company增加了小张科技,但是mobile为空,这种时候要怎么做成只是company更新,mobile变为空。
导入大量数据的情况下要怎么处理比较好。
重写JS保留小数-去尾法
weixin_58345141:
直接split就好
数据结构C-二叉树的二叉链表存储表示
大雪纷飞,亭间愁思何人懂:
需要按一下空格 不是直接enter
数据结构C-二叉树的二叉链表存储表示
大雪纷飞,亭间愁思何人懂:
要按一下空格 而不是直接enter
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Ubuntu Desktop 16 配置ssh远程登录
将Vue实例的变量显示到页面,方便实时查看Vue实例变量
CSS单词换行与对齐
2022年1篇
2020年8篇
2019年49篇
2018年16篇
2017年7篇
2015年2篇
目录
目录
分类专栏
前端
7篇
音乐
1篇
笔记
2篇
Linux
24篇
PHP环境
15篇
PHP
5篇
Nginx
9篇
MySQL
10篇
Python
4篇
设计模式
HK(Web技术实战篇)
行为习惯
数据结构
8篇
数学
搜索引擎
1篇
Redis
2篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
飞蛾逐月
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值