SocketIO总结
我在马克飞象上写的一样的内容,感觉那个样式好看的:WorkerMan的部分总结
workerman中部分函数总结
以下是把我搜集到的资料进行了一个整合。详细怎么使用。慢慢摸索吧。
Worker类
Connection类
SocketIO类
Socket类官网样例分析
在WEB消息推送框架官网中他介绍了一个简单的样例,说这个样例简单,我仅仅能呵呵,当中的小心思,细思极恐啊,且听我慢慢道来。
首先来看后端的代码,也就是start.php
文件的代码。
<?
php
/**
告诉你怎么用这个文件,这个文件不是用浏览器去訪问的,而是使用php在本地运行的,像以下这样,注意路径,这里默认运行该命令时。start.php在该路径下:
* php start.php start
*/
/*Worker类的命名空间。至于为什么以下会使用到Worker类。以下再介绍*/
use Workerman\Worker;
// 编译好的自己主动载入文件,注意路径。一定要载入,否则会报错
include __DIR__ . '/vendor/autoload.php';
// 检測你的环境,该类分windows版本号和linux版本号的,所以这里是做一个检測
if(strpos(strtolower(PHP_OS), 'win') === 0)
{
exit("傻逼,你下成了windows版本号的,去又一次下过。\n");
}
// 标记是全局启动,我也不知道是干嘛的。后来是直接自己写了,就没实用start.php文件了
define('GLOBAL_START', 1);
// 载入IO 和 Web
require_once __DIR__ . '/start_io.php';
require_once __DIR__ . '/start_web.php';
//这里分别说一下上面两个文件,第一个start_io.php,基本的处理文件,全部的请求和处理都是该文件来实现的,也就是我们接下来要重点解说的文件
//start_web.php是开启了一个web服务,也就是我们常说的apache或者nginxserver。假设你自己装了webserver的,那么这个文件也就没有什么用了。
// 运行全部服务,看过Worker类文档的应该都知道这个静态方法的作用了,就是使我们定义的全部Worker类起作用
Worker::runAll();
?
>
看过了上面的介绍后,我们就知道,假设我们想要定制自己的特色处理功能,那么重点就是要改动start_io.php
。偏偏该部分又不是由一个部分组成的。详细来说是由3部分组成的。这三部分各自是:
- client的js代码
- 本地的socket_io.php文件
- 本地的间接操作socket_io.php的PHP文件
可能有点糊涂了。那么我在这里介绍一下start_io.php
的运行顺序,以及怎样与另外两个文件配合:
- 创建一个供client连接的
socket
:
$sender_io = new SocketIO(2120);
注意port号:2120
- 创建一个供本地PHP文件通信的
soket
//先创建。再监听该port
$inner_http_worker = new Worker('http://0.0.0.0:2121');
$inner_http_worker->listen();
注意port号:2121
准备工作做好了,接下来就看详细的运行顺序了:
- 用户端登录对应页面,运行js代码,与后台建立
socket
通信,详细的js代码例如以下:
<script src='http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 输入參数格式是:协议://ip地址:port号
var socket = io('http://127.0.0.1:2120');
// uid是组号
uid = 123;
// socket建立,建立后进行登录,并将uid传递回后台
socket.on('connect', function(){
socket.emit('login', uid);
});
</script>
注意js连接的port号:2120
这里介绍一下uid的作用,我刚開始没想明确。结果被坑了3个小时。
uid是分组的意思。属于同一分组的socket能够统一发送消息,假设一个socket就是一组的话,那么就能够实现依据uid进行单独发送。样例中就是这么想的。
对分组中的用户发送信息
//不包含自己
socket.broadcast.to(uid).emit(‘event_name’, data);
//包含自己
io.sockets.in(uid).emit(‘event_name’, data);
回到js代码上来,这里js
代码使用了socket.io.js
这个SocketIO
类的配套js
库代码与后台建立了socket
通信。
那么问题来了,当我们想与client通信时,仅仅能通过start_io.php
文件了,而start_io.php
会在命令行中一直运行,那么。当我们想主动与start_io.php
管理下的socket
通信的话,那么我们该怎么办?或者我们外部人员怎样与socket_io.php
通信?
解决方法1:
去訪问socket_io.php
下的socket,然后在socket_io.php
中编写对应的代码,这样就能够在外部操作socket_io.php
文件里的内容了,也就是等于间接和socket_io.php
管理下的client通信
缺点:
与客户抢占socket
资源,一个socket
能处理的连接是有限的,应该尽最大可能预留给客户,所以上述方案是能够实现的,可是欠妥当。
解决方式2:
建立新的socket
,专门为本地訪问socket_io.php
使用,并在socket_io.php
中进行监听。这也是官网上那个样例的做法。看后台源代码:
$sender_io->on('workerStart', function(){
// 监听一个httpport
$inner_http_worker = new Worker('http://0.0.0.0:2121');
// 当httpclient发来数据时触发
$inner_http_worker->onMessage = function($http_connection, $data){
//本地PHP文件触发该socket的该部分功能时运行的代码
}
};
// 运行监听
$inner_http_worker->listen();
}
当中,当socket_io.php
開始运行后,就会实例化一个Worker
类。并在代码中监听该port,当外部尝试连接该socket
后。就会触发Worker
类的onMessage
回调函数,開始运行后面的function()
,那么我们就能够在内部设定对应的操作了。
这样就能够实现使用另外的php代码来操作start_io.php
下的socket了。
这样做和解决方式1有什么差别呢?首先我们新开了一个socket
。专门用来与start_io.php
进行通信,也就是2121
port,而客户连接的是2120
port。两者并不冲突,从而也不会影响客户的操作。
缺点:
这个专门用于本地php代码操作start_io.php
的socket
不止你能够用,别人也能够用,比方我能够使用上面的js
代码自己连接到该port进行操作。绕过你的php文件,那么可想而知,这绝对是一场灾难,所以一定要在
$inner_http_worker->onMessage = function($http_connection, $data){
//一定要在这里增加验证,保证外部人员连接时。能够进行辨别
}
};
上面都说使用本地php脚本来操作start_io.php
文件。却一直没有说详细的方法,以下就来看详细的代码,事实上就是使用php的curl
函数,与2121
port进行通信,从而间接操作start_io.php
。
以下是官网上的样例:
<?php
// 指明给谁推送。为空表示向全部在线用户推送
$to_uid = "";
// 推送的url地址,使用自己的server地址
$push_api_url = "http://workerman.net:2121/";
$post_data = array(
"type" => "publish",
"content" => "这个是推送的測试数据",
"to" => $to_uid,
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
$return = curl_exec ( $ch );
curl_close ( $ch );
var_export($return);
curl
这块我还不熟,所以要我解释上面那段代码的含义还须要一会,如今能确定的是:
- 传输的内容被编写在$post_data中
- 会以POST的方式将数据发送到2121port中去
到此为止,SocketIO
的样例就介绍完了,可能有点糊涂,所以不妨自己试试,这毕竟仅仅是我的总结,肯定不如你们自己学习来的好的。
SocketIO总结的更多相关文章
- Node+Socketio实现消息群发功能
注:本博文是作者原创,转载请注明出处. 在项目中时常会使用到socketio,今天我们就来实现Node+socketio实现群发消息功能, 项目源码:https://github.com/zhangx ...
- 使用nodejs+express+socketio+mysql搭建聊天室
使用nodejs+express+socketio+mysql搭建聊天室 nodejs相关的资料已经很多了,我也是学习中吧,于是把socket的教程看了下,学着做了个聊天室,然后加入简单的操作mysq ...
- NodeJS+ExpressJS+SocketIO+MongoDB应用模板
OS:Win8.1 with update 关键字:NodeJS,ExpressJS,SocketIO,MongoDB. 1.源代码下载:https://github.com/ldlchina/ESM ...
- Django socketio 安装
如果你还没有安装过 gevent,首先需要安装 libevent, 编译安装 libevent 需要安装 Pyhton 开发库. 在Debain上可以运行如下指令: $ sudo apt-get in ...
- socketio 握手前中断报错
前两天折腾了下socketio,部署完发现通过nginx代理之后前端的socket无法和后端通信了,于是暴查一通,最后解决问题: location / { proxy_pass http://127. ...
- NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)
项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...
- CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程
请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...
- express session 和 socketio session关联
express session http是没有状态的协议, 需要web框架自己实现会话和会话管理工作. express框架有session插件可以使用. 见如下介绍: https://www.tuto ...
- SocketIO Server
package com.fd.socketio; import org.json.JSONObject; import com.corundumstudio.socketio.AckRequest; ...
- websocket和socketio的总结
1.WebSocket是什么? WebScoket是一种让客户端和服务器之间能进行双向实时通信的技术.它是HTML最新标准HTML5的一个协议规范,本质上是个基于TCP的协议,它通过HTTP/HTTP ...
随机推荐
- c++ dll 创建
建立一个C++的Win32DLL,这里要注意选择"Export symbols"导出符号.点击完成. 如下图所示: 由于项目的名称是"TestCPPDLL" ...
- [python工具][1]sublime安装与配置
http://www.cnblogs.com/wind128/p/4409422.html 1 官网下载版本 http://www.sublimetext.com/3 选择 Windows - al ...
- [uiautomator篇][1] 官网译文
http://www.jianshu.com/p/7718860ec657 2016.07.25 20:59 字数 3675 Android UIAutomator浅谈 --------------- ...
- docker容器为什么可以跨平台部署
docker镜像和操作系统没关系,docker最大的价值就是提出了镜像打包技术.首先你的明白什么是docker,什么是镜像,什么是容器,然后你就能明白镜像和操作系统之间的关系.docker是一个引擎, ...
- List容器——LinkedList及常用API,实现栈和队列
LinkedList及常用API ① LinkedList----链表 ② LinkedList类扩展AbstractSequentialList并实现List接口 ③ LinkedLis ...
- git如何忽略文件或者文件夹
用git开发中会有一些不愿意提交的目录或者文件 在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按 ...
- HDU-2768 Cat vs. Dog
题意一开始是理解错的...结果就各种WA啦~ 对于两个观众,假如有某只宠物,一个人讨厌另一个人却喜欢,这两个人就是有矛盾的,连边. 最后求最小顶点覆盖.因为把这个覆盖点集去掉的话剩下的图中没有两个点是 ...
- 给某个li标签家样式
HTML: <div class="tabs clearfix"> <ul id="der"> <li ><a hre ...
- Java24种设计模式的优点、缺点和适用环境总结
一.7个常用的面向对象设计原则 1.单一职责原则: 它是实现高内聚.低耦合的指导方针:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中: 2.开闭原则: 指软件实体应尽量在不改变原有的代 ...
- d3 使用随机数据生成条形图
).map(function(){ ,)(),); }) // 返回 [27.2, 12.9, 12.2, 6.8, 9.4, 7.1, 17.5, 30, 16.6, 24.3, 19, 16.6, ...