swoole实现一个socketio示例代码

代码语言:phpcli

所属分类:通讯

代码描述:swoole实现一个socketio示例代码

代码标签: socketio 示例

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<?php
/**
*  packet types
*  0 open
*  Sent from the server when a new transport is opened (recheck)
*  1 close
*  Request the close of this transport but does not shutdown the connection itself.
*  2 ping
*  Sent by the client. Server should answer with a pong packet containing the same data
*  3 pong
*  Sent by the server to respond to ping packets.
*  4 message
*  actual message, client and server should call their callbacks with the data.
*  5 upgrade
*  Before engine.io switches a transport, it tests, if server and client can communicate over this transport. If this *    test succeed, the client sends an upgrade packets which requests the server to flush its cache on the old transport *   and switch to the new transport.
*  6 noop
*  A noop packet. Used primarily to force a poll cycle when an incoming websocket connection is received.
*  packet data types
*  Packet#CONNECT (0)
*  Packet#DISCONNECT (1)
*  Packet#EVENT (2)
*  Packet#ACK (3)
*  Packet#ERROR (4)
*  Packet#BINARY_EVENT (5)
*  Packet#BINARY_ACK (6)
*  basic format    => $socket->emit("message", "hello world");
*                  => sprintf('%d%d%s', $packetType, $packetDataType, json_encode([$event, $data]))
*                  => 42["message", "hello world"]
*/
class SocketIOParser
{
    private static $instance;
    public $id;
    protected $server;
    protected $events = [];

    private $ackId;


    private function __construct() {}

    public static function getInstance() {
        return self::$instance ?: (self::$instance = new self);
    }


    /**
    * register socketio event
    * @param $event
    * @param Closure $callback
    */
    public function on($event, Closure $callback) {
        if (is_string($event)) {
            $this->events[$event] = $callback;
        }
    }

    /**
    * listen server event
    * @param $server
    */
    public function bindEngine($server) {
        $server->on('Open', [$this, 'onOpen']);
        $server->on('Message', [$this, 'onMessage']);
        $server->on('Close', [$this, 'onClose']);
    }


    public function onOpen($server, $request) {
        $this->server = $server;
        $this->id = $request->fd;
        $data = [
            'sid' => 'abcdefg',
            //whatever
            'upgrades' => ['websocket'],
            'pingInterval' => 25000,
            'pingTimeout' => 60000,
        ];
        $server->push($request->fd, '0'.json_encode($data)); //socket is open
        $server->push($request->fd, '40'); //client is connected
        if (isset($this->events['connection'])) {
            $this->events['connection']($this);
        }
    }

    public function onClose($server, $fd) {
        $this->server = $server;
        $this->id = $fd;
        if (isset($this->events['disconnect'])) {
            $this->events['disconnect']($this);
        }
    }


    public function onMessage($server, $frame) {
        $this->server = $server;
        $this->id = $frame->fd;

        if ($index = strpos($frame->data, '[')) {
            $code = substr($frame->data, 0, $index);
            $data = json_decode(substr($frame->data, $index), true).........完整代码请登录后点击上方下载按钮下载查看

网友评论0