websocket
-
打开官网,我们看到
需要注意的是,其中的回调函数open与close不是填的,但是message这个回调方法是必须实现的,我们拿到上面的代码,直接复制,在/study 目录下新建一个websocket.php 文件 -
我们继续在/study 目录下新建一个websocket.html文件,开始撰写相关的前端代码
在上面的demo中,相关的js代码可以在websocket的资料中可以搜索的到,作用跟上面的备注相关联,这里需要注意的是 在js连接websocket中 url的前缀必须为ws:// 不能为http或https -
在这里需要补充一点,websocket是基于tcp的,在这里的区别,可以看相关资料:https://www.cnblogs.com/jiangzhaowei/p/8781635.html 这里有更详细的讲解,由于websocket是基于tcp我们需要需要打开之前撰写的http_server.php 在Linux命令行中运行它 php http_server.php 然后再执行刚刚撰写的websocket.php
然后我们打开域名,端口号为刚刚撰写的websocket中的端口,笔者这里的端口为9501,我们需要打开的网站为http_server.php的端口:url:8811/websocket.html,需要一提的是,如果购买的是云服务器,不是本地的虚拟机,请开放安全组!
4.由于websocket是基于tcp的连接,我们也可以在这里设置一个set方法调用,这样的好处是可以不在去启动Http_server这个文件,单独跑websocket这个文件即可,我们只需要调用多一个set方法即可
-
优化websocket代码
如大家所看到的,上面的代码都是一些面向过程的代码,如果实际业务当中,业务简单的还好,如果是业务复杂的代码,这种面向过程的代码会非常头疼,我们对代码进行一下封装,对代码做一些简单的优化
<?php
/**
*websocket基础类
*/
class WebSocket {
//shot 仅允许本机运行为127.0.0.1 允许指定ip 则47.123.124.1 允许所有ip则为0.0.0.0
private static $host = '0.0.0.0';
//端口号
private static $port = 9501;
//websocket初始化对象
public $socket = null;
function __construct()
{
//websocket类
$this->socket = new Swoole\WebSocket\Server(self::$host, self::$port);
//静态文件访问
$this->socket->set([
'enable_static_handler' => true, //开启静态资源
'document_root' => '/study' //静态资源目录
]);
//建立建立执行
$this->socket->on('open',[$this,'onopen']);
//接收客户端发送消息
$this->socket->on('message',[$this,'onmessage']);
//关闭连接时执行此函数
$this->socket->on('close',[$this,'onclose']);
//启动服务
$this->socket->start();
}
/**
*客户端与服务器建立连接并完成握手后会回调此函数
*/
public function onopen($server,$request){
var_dump("server-success:{$request->fd}\n");
}
/**
*当服务器收到来自客户端的数据帧时会回调此函数。
*/
public function onmessage($server,$frame){
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
$server->push($frame->fd,'date:'.date('Y-m-d H:i:s',time()));
}
/**
*当服务器连接关闭时回调此函数
*/
public function onclose($server,$fd){
var_dump("client: $fd end \n");
}
}
$obj = new WebSocket();
上面就是我们优化之后的代码,直接运行该文件,一个简单的websocket就连接了