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