websocket tcpsocket 区别

sbjwwjsm

我用原始php写了 tcpSocket 。用tcpClient 能连接,websocket也能连接。那workerman里者两种server区别在哪里?

5690 6 0
6个回答

walkor 打赏

websocket 是一种通讯协议,类似http ftp smtp这些都是属于通讯协议。

不管websocket http ftp smtp 等这些应用层通讯协议都是基于tcp传输层协议的。

  • 暂无评论
sbjwwjsm
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket服务端
$ws = new Worker('websocket://0.0.0.0:4236');
$ws->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER标识来自哪个站点的页面发起的websocket链接
        if($_SERVER != 'http://chat.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
};
Worker::runAll();

开启websocket后 netstat -anp|grep 4236 看不到监听 。 ps aux|grep php 可以看到进程

开启tcp后 netstat -anp|grep 4236 就看得到监听

  • 暂无评论
sbjwwjsm

加上worker = new Worker("websocket://0.0.0.0:8005");就这样

Workerman start in DEBUG mode
Master socket : Resource id #19

没有就

Workerman start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.3.6          PHP version:5.5.36
------------------------ WORKERS -------------------------------
user          worker        listen               processes status
root          none          tcp://0.0.0.0:8000    4          
root          none          http://0.0.0.0:8005   1          
  • 暂无评论
walkor 打赏

不要提前运行 Worker::runAll();

  • 暂无评论
sbjwwjsm

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
Worker::$daemonize = true;
$ws_worker = new Worker("tcp://0.0.0.0:8000");
$wd_worker = new Worker("http://0.0.0.0:8005");
$ww_worker = new Worker("websocket://0.0.0.0:8081");
//启动4个进程对外提供服务
//当接收到客户端发来的数据后显示数据并回发到客户端
$ws_worker->onMessage = function($connection, $data) {
//显示数据
echo "you just received: $data\n";

//向客户端回发数据  
$connection->send("you just send: $data");  

};

//运行worker
Worker::runAll();
?>
还是Master socket : Resource id #19

  • 暂无评论
walkor 打赏

不要直接运行 Worker::runAll();
运行 Worker::runAll(); 后后面的代码就不会运行了,也就是其它端口的监听代码执行不到。

Worker::runAll(); 去掉
或者像例子那样改成
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}

  • 暂无评论
年代过于久远,无法发表回答
×
🔝