我在马克飞象上写的一样的内容,感觉那个样式好看的: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进行通信,也就是2121port,而客户连接的是2120port。两者并不冲突,从而也不会影响客户的操作。

缺点:

这个专门用于本地php代码操作start_io.phpsocket不止你能够用,别人也能够用,比方我能够使用上面的js代码自己连接到该port进行操作。绕过你的php文件,那么可想而知,这绝对是一场灾难,所以一定要在


$inner_http_worker->onMessage = function($http_connection, $data){
//一定要在这里增加验证,保证外部人员连接时。能够进行辨别
}
};

上面都说使用本地php脚本来操作start_io.php文件。却一直没有说详细的方法,以下就来看详细的代码,事实上就是使用php的curl函数,与2121port进行通信,从而间接操作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这块我还不熟,所以要我解释上面那段代码的含义还须要一会,如今能确定的是:

  1. 传输的内容被编写在$post_data中
  2. 会以POST的方式将数据发送到2121port中去

到此为止,SocketIO的样例就介绍完了,可能有点糊涂,所以不妨自己试试,这毕竟仅仅是我的总结,肯定不如你们自己学习来的好的。

SocketIO总结的更多相关文章

  1. Node+Socketio实现消息群发功能

    注:本博文是作者原创,转载请注明出处. 在项目中时常会使用到socketio,今天我们就来实现Node+socketio实现群发消息功能, 项目源码:https://github.com/zhangx ...

  2. 使用nodejs+express+socketio+mysql搭建聊天室

    使用nodejs+express+socketio+mysql搭建聊天室 nodejs相关的资料已经很多了,我也是学习中吧,于是把socket的教程看了下,学着做了个聊天室,然后加入简单的操作mysq ...

  3. NodeJS+ExpressJS+SocketIO+MongoDB应用模板

    OS:Win8.1 with update 关键字:NodeJS,ExpressJS,SocketIO,MongoDB. 1.源代码下载:https://github.com/ldlchina/ESM ...

  4. Django socketio 安装

    如果你还没有安装过 gevent,首先需要安装 libevent, 编译安装 libevent 需要安装 Pyhton 开发库. 在Debain上可以运行如下指令: $ sudo apt-get in ...

  5. socketio 握手前中断报错

    前两天折腾了下socketio,部署完发现通过nginx代理之后前端的socket无法和后端通信了,于是暴查一通,最后解决问题: location / { proxy_pass http://127. ...

  6. NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)

    项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...

  7. CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程

    请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...

  8. express session 和 socketio session关联

    express session http是没有状态的协议, 需要web框架自己实现会话和会话管理工作. express框架有session插件可以使用. 见如下介绍: https://www.tuto ...

  9. SocketIO Server

    package com.fd.socketio; import org.json.JSONObject; import com.corundumstudio.socketio.AckRequest; ...

  10. websocket和socketio的总结

    1.WebSocket是什么? WebScoket是一种让客户端和服务器之间能进行双向实时通信的技术.它是HTML最新标准HTML5的一个协议规范,本质上是个基于TCP的协议,它通过HTTP/HTTP ...

随机推荐

  1. loj2013 「SCOI2016」幸运数字

    点分治+线性基 (为了这六个字窝调了一下午一晚上QAQ #include <iostream> #include <cstring> #include <cstdio&g ...

  2. day04_08 while循环02

    练习题: 1.输出九九乘法表 2.使用#号输出一个长方形,用户可以指定宽和高,如果长为3,高为4,则输出一个 横着有3个#号,竖着有4个#号 的长方形. 3.如何输出一个如下的直角三角形,用户指定输出 ...

  3. jQuery 遍历函数 ,javascript中的each遍历

    jQuery 遍历函数 jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合 ...

  4. (英文排版测试)Lorem Ipsum

    Lorem Ipsum Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt consequat pretiu ...

  5. 使用 D8 分析 javascript 如何被 V8 引擎优化的

    在上一篇文章中我们讲了如何使用 GN 编译 V8 源码,文章最后编译完成的可执行文件并不是 V8,而是 D8.这篇我们讲一下如何使用 D8 调试 javascript 代码. 如果没有 d8,可以使用 ...

  6. [git 学习篇] --创建git创库

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d ...

  7. 剪枝的定义&&hdu1010

    半年前在POJ上遇到过一次剪枝的题目,那时觉得剪枝好神秘...今天在网上查了半天资料,终于还是摸索到了一点知识,但是相关资料并不多,在我看来,剪枝是技巧,而不是方法,也就是说,可能一点实用的小技巧,让 ...

  8. 【转】参照protobuf,将json数据转换成二进制在网络中传输。

    http://blog.csdn.net/gamesofsailing/article/details/38335753?utm_source=tuicool&utm_medium=refer ...

  9. ora-08104 该索引对象 159639 正在被联机建立或重建

    SSH远程连接数据库创建索引,网络中断后,删除索引信息报ora-08104 解决方法: 使用ONLINE_INDEX_CLEAN清除索引痕迹 在sys用户下执行 SQL> conn /as sy ...

  10. 使用runtime关联对象将视图添加到视图的类目里

    //get方法 - (RJCircularLoaderView*)rj_circularLoaderView { RJCircularLoaderView *loaderView = objc_get ...