public function bind($host, $port, $options = array())
 {
     $this->server = new \swoole_websocket_server($host, $port);
     $this->server->set(array('task_worker_num' => 8, 'daemonize' => $options['daemon'], 'log_file' => $options['log-file']));
     $this->server->on('Close', array($this, 'onClose'));
     $this->server->on('Message', function ($server, $frame) {
         $this->process($frame->data, $frame->fd);
     });
     $this->server->on('Task', array($this, 'onTask'));
     $this->server->on('Finish', function ($server, $task_id, $data) {
         Cli::out("Task #{$task_id} finished.");
     });
     if (!empty($options['tcp-host'])) {
         $this->server->addlistener($options['tcp-host'], $options['tcp-port'], SWOOLE_SOCK_TCP)->set(array('open_length_check' => true, 'package_length_type' => 'N', 'package_length_offset' => 0, 'package_body_offset' => 4, 'package_max_length' => 102400));
         $this->server->on('Receive', function ($server, $fd, $from, $data) {
             $this->process(substr($data, 4), $fd);
         });
         Cli::out("Additionally listening on " . sprintf("tcp://%s:%d", $options['tcp-host'], $options['tcp-port']));
     }
     return $this;
 }
Beispiel #2
0
<?php

$server = new swoole_websocket_server("0.0.0.0", 9501);
//$server = new swoole_websocket_server("0.0.0.0", 9501, SWOOLE_BASE);
$server->addlistener('0.0.0.0', 9502, SWOOLE_SOCK_UDP);
$server->set(['worker_num' => 4]);
function user_handshake(swoole_http_request $request, swoole_http_response $response)
{
    //自定定握手规则,没有设置则用系统内置的(只支持version:13的)
    if (!isset($request->header['sec-websocket-key'])) {
        //'Bad protocol implementation: it is not RFC6455.'
        $response->end();
        return false;
    }
    if (0 === preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $request->header['sec-websocket-key']) || 16 !== strlen(base64_decode($request->header['sec-websocket-key']))) {
        //Header Sec-WebSocket-Key is illegal;
        $response->end();
        return false;
    }
    $key = base64_encode(sha1($request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
    $headers = array('Upgrade' => 'websocket', 'Connection' => 'Upgrade', 'Sec-WebSocket-Accept' => $key, 'Sec-WebSocket-Version' => '13', 'KeepAlive' => 'off');
    foreach ($headers as $key => $val) {
        $response->header($key, $val);
    }
    $response->status(101);
    $response->end();
    return true;
}
$server->on('handshake', 'user_handshake');
$server->on('open', function (swoole_websocket_server $_server, swoole_http_request $request) {
    echo "server#{$_server->worker_pid}: handshake success with fd#{$request->fd}\n";