SocketIO总结

摘要:
属于同一数据包的套接字可以统一发送消息。如果一个套接字是一个组,则可以根据uid单独发送。听代码中的端口。当外部尝试连接到套接字时。首先,我们打开了一个新的套接字。

我在马克飞象上写的一样的内容,感觉那个样式好看的:WorkerMan的部分总结


workerman中部分函数总结

以下是把我搜集到的资料进行了一个整合。详细怎么使用。慢慢摸索吧。

Worker类

中文文档

Connection类

中文文档

SocketIO类

中文文档

Socket类官网样例分析

WEB消息推送框架官网中他介绍了一个简单的样例,说这个样例简单,我仅仅能呵呵,当中的小心思,细思极恐啊,且听我慢慢道来。

首先来看后端的代码,也就是start.php文件的代码。

<?

php

/** 告诉你怎么用这个文件,这个文件不是用浏览器去訪问的,而是使用php在本地运行的,像以下这样,注意路径,这里默认运行该命令时。start.php在该路径下: * php start.php start */ /*Worker类的命名空间。至于为什么以下会使用到Worker类。以下再介绍*/ use WorkermanWorker; // 编译好的自己主动载入文件,注意路径。一定要载入,否则会报错 include __DIR__ . '/vendor/autoload.php'; // 检測你的环境,该类分windows版本号和linux版本号的,所以这里是做一个检測 if(strpos(strtolower(PHP_OS), 'win') === 0) { exit("傻逼,你下成了windows版本号的,去又一次下过。 "); } // 标记是全局启动,我也不知道是干嘛的。后来是直接自己写了,就没实用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总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php的sessionLinux显示不了中文下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

服务端CURL请求

服务端与服务端之间,也存在接口编程。 比如我们网站服务端,需要发送短信、发送邮件、查询快递等,都需要调用第三方平台的接口。 1、php中发送请求 ①file_get_contents函数 :传递完整的url参数 通常是get请求,有返回值(地址中的输出) ②curl请求方式(PHP的curl函数库):php中比较规范的一种发送请求方式。 2、CURL函数...

python-gevent模块实现socket大并发

服务器端:gevent_server.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import sys import socket import time import gev...

4wpa_supplicant适配层 详解

适配层是 通用的wpa_supplicant的 封装,在Android中 作为 WiFi部分的 硬件抽象层来使用。wpa_supplicant适配层 主要用于 与wpa_supplicant守护进程 的 通信,以提供给Android框架使用,它实现了 加载、控制 和 消息监控等功能。           1、当java层调用 loadDriver时, 它...

Linux Socket学习(十二)

套接口选项在前面的几章中,我们讨论了使用套接口的基础内容。现在我们要来探讨一些可用的其他的特征。在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备。在这一章,我们将会专注于下列主题:如何使用getsockopt(2)函数获得套接口选项值如何使用setsockopt(2)函数设置套接口选项值如何使用这些常用的套接口选项得到套接口选项有时,...

移动APP 微信支付完整过程(wxPay 方案一)

前两天开始做移动端APP的微信支付,过程中遇到了一些问题,比如支付的过程中返回值总是:-1 {status:false},这些问题已经得到了解决。前人栽树,后人尽管乘凉,那么分享一下整个支付过程(wxPay 方案一): 1、申请微信开发平台的账号、创建移动应用、申请开发者资质认证(整个过程APICLOUD官方网站已经给出了相当明确的操作步骤,与实际操作没有...

网络编程传输文件

简易版服务器server import socket,struct,json sk = socket.socket() buffer = 1024 #每次接收数据的大小 sk.bind(('127.0.0.1',8090)) sk.listen() conn,addr = sk.accept() #接收 head_len = conn.recv(4) h...