1、服务端和客户端链接javascript
一、建立一个SocketIO服务端php
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use PHPSocketIO\SocketIO; // 建立socket.io服务端,监听3120端口 $io = new SocketIO(3120); // 当有客户端链接时打印一行文字 $io->on('connection', function($socket)use($io){ echo "new connection coming\n"; }); Worker::runAll();
二、建立一个客户端css
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script> <script> // 若是服务端不在本机,请把127.0.0.1改为服务端ip var socket = io('http://127.0.0.1:3120'); // 当链接服务端成功时触发connect默认事件 socket.on('connect', function(){ console.log('connect success'); }); </script>
2、自定义事件java
socket.io主要是经过事件来进行通信交互的。nginx
socket链接除了自带的connect,message,disconnect三个事件之外,在服务端和客户端开发者能够自定义其它事件。git
服务端和客户端都经过emit方法触发对端的事件。github
例以下面的代码在服务端定义了一个chat message
事件,事件参数为$msg
。数组
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use PHPSocketIO\SocketIO; $io = new SocketIO(3120); // 当有客户端链接时 $io->on('connection', function($socket)use($io){ // 定义chat message事件回调函数 $socket->on('chat message', function($msg)use($io){ // 触发全部客户端定义的chat message from server事件 $io->emit('chat message from server', $msg); }); }); Worker::runAll();
客户端经过下面的方法触发服务端的chat message事件。socket
<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script> <script> // 链接服务端 var socket = io('http://127.0.0.1:3120'); // 触发服务端的chat message事件 socket.emit('chat message', '这个是消息内容...'); // 服务端经过emit('chat message from server', $msg)触发客户端的chat message from server事件 socket.on('chat message from server', function(msg){ console.log('get message:' + msg + ' from server'); }); </script>
3、workerStart事件函数
phpsocket.io提供了workerStart事件回调,也就是当进程启动后准备好接受客户端连接时触发的回调。 一个进程生命周期只会触发一次。能够在这里设置一些全局的事情,好比开一个新的Worker端口等等。
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use PHPSocketIO\SocketIO; $io = new SocketIO(9120); // 监听一个http端口,经过http协议访问这个端口能够向全部客户端推送数据(url相似http://ip:9191?msg=xxxx) $io->on('workerStart', function()use($io) { $inner_http_worker = new Worker('http://0.0.0.0:9191'); $inner_http_worker->onMessage = function($http_connection, $data)use($io){ if(!isset($_GET['msg'])) { return $http_connection->send('fail, $_GET["msg"] not found'); } $io->emit('chat message', $_GET['msg']); $http_connection->send('ok'); }; $inner_http_worker->listen(); }); // 当有客户端链接时 $io->on('connection', function($socket)use($io){ // 定义chat message事件回调函数 $socket->on('chat message', function($msg)use($io){ // 触发全部客户端定义的chat message from server事件 $io->emit('chat message from server', $msg); }); }); Worker::runAll();
4、分组
socket.io提供分组功能,容许向某个分组发送事件,例如向某个房间广播数据。
一、加入分组(一个链接能够加入多个分组)
$socket->join('group name');
二、离开分组(链接断开时会自动从分组中离开)
$socket->leave('group name');
5、向客户端发送事件的各类方法
$io是SocketIO对象。$socket是客户端链接
$data能够是数字和字符串,也能够是数组。当$data是数组时,客户端会自动转换为javascript对象。
同理若是客户端向服务端emit某个事件传递的是一个javascript对象,在服务端接收时会自动转换为php数组。
一、向当前客户端发送事件
$socket->emit('event name', $data);
二、向全部客户端发送事件
$io->emit('event name', $data);
三、向全部客户端发送事件,但不包括当前链接。
$socket->broadcast->emit('event name', $data);
四、向某个分组的全部客户端发送事件
$io->to('group name')->emit('event name', $data);
6、获取客户端ip
$io->on('connection', function($socket)use($io){ var_dump($socket->conn->remoteAddress); });
7、关闭连接
$socket->disconnect();
8、限制链接域名
当咱们想指定特定域名的页面才能链接,能够用$io->origins方法来设置域名白名单。
$io = new SocketIO(2020); $io->origins('http://example.com:8080');
多个域名时用空格分隔,相似
$io = new SocketIO(2020); $io->origins('http://workerman.net http://www.workerman.net');
9、支持SSL(https wss)
SSL支持有两种方法,workerman原生和nginx代理
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use PHPSocketIO\SocketIO; // 传入ssl选项,包含证书的路径 $context = array( 'ssl' => array( 'local_cert' => '/your/path/of/server.pem', 'local_pk' => '/your/path/of/server.key', 'verify_peer' => false, ) ); $io = new SocketIO(2120, $context); $io->on('connection', function($socket)use($io){ echo "new connection coming\n"; }); Worker::runAll();
注意:
一、证书是要验证域名的,因此客户端连接时要指定域名才能顺利的创建连接。
二、客户端链接时不能再用http方式,要改为https相似下面这样。
<script> var socket = io('https://yoursite.com:2120'); //..... </script>
本文摘自:https://github.com/walkor/phpsocket.io/tree/master/docs/zh