EASYLT文档 > Swoole框架 > Server/Client服务

TCP服务器

<?php
//引入服务器配置文件【必须实现】
include('server.ini');

//创建服务器【必须实现】
$tcp_serv = new Tcp_server($ip,$port);
/**
 *$ip为服务器监听ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Tcp_server('',9501);
 */

//当客户端连接成功时触发【可选项】
$tcp_serv->connect(function(){
    //匿名回调函数中写你的业务
});

//当接收到请求数据时【必须实现】
$tcp_serv->receive(function($request_data){
    //$request_data为客户端发送的数据
    //匿名回调函数中写你的业务
    //如需给客户端返回数据请return $var
});

//处理task异步任务,具体操作请阅读异步任务部分文档【可选项】
$tcp_serv->task(function($request_data,$task_id,$reactor_id){
    //$request_data为客户端发送的数据
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//task异步任务完成事件【如启用task则必须实现】
$tcp_serv->finish(function($state,$task_id,$reactor_id){
    //$state为task异步任务运行结果状态,当$state等于true时,异步任务运行完成。
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//当客户端关闭成功时触发【可选项】
$tcp_serv->close(function(){
    //匿名回调函数中写你的业务
});

//启动服务器【必须实现】
$tcp_serv->start();

TCP客户端

<?php
//引入服务器配置文件【WEB服务器(FPM)运行无需实现  server服务的CLI模式运行必须实现】
include('server.ini');

//创建客户端【必须实现】
$tcp_cli = new Tcp_client($ip,$port);
/**
 *$ip为服务器ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Tcp_client('',9501);
 */

//像服务器发送数据【必须实现】
$tcp_cli->send(function(){
    //匿名回调函数中写你的业务
    //如需发送数据请return $var
});

//从服务器接收数据【必须实现】
$tcp_cli->receive(function($response_data){
    //$response_data为服务器返回的数据
    //匿名回调函数中写你的业务
});

//关闭连接【必须实现】
$tcp_cli->close();

-----------------------------------------------------------------------------------------------------------------------------------------------

UDP服务器

<?php
//引入服务器配置文件【必须实现】
include('server.ini');

//创建服务器【必须实现】
$udp_serv = new Udp_server($ip,$port);
/**
 *$ip为服务器监听ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Udp_server('',9501);
 */

//当接收到请求数据时【必须实现】
$udp_serv->receive(function($request_data){
    //$request_data为客户端发送的数据
    //匿名回调函数中写你的业务
    //如需给客户端返回数据请return $var
});

//处理task异步任务,具体操作请阅读异步任务部分文档【可选项】
$udp_serv->task(function($request_data,$task_id,$reactor_id){
    //$request_data为客户端发送的数据
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//task异步任务完成事件【如启用task则必须实现】
$udp_serv->finish(function($state,$task_id,$reactor_id){
    //$state为task异步任务运行结果状态,当$state等于true时,异步任务运行完成。
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//启动服务器【必须实现】
$udp_serv->start();

UDP客户端

<?php
//引入服务器配置文件【WEB服务器(FPM)运行无需实现  server服务的CLI模式运行必须实现】
include('server.ini');

//创建客户端【必须实现】
$udp_cli = new Udp_client($ip,$port);
/**
 *$ip为服务器ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Udp_client('',9501);
 */

//像服务器发送数据【必须实现】
$udp_cli->send(function(){
    //匿名回调函数中写你的业务
    //如需发送数据请return $var
});

//从服务器接收数据【必须实现】
$udp_cli->receive(function($response_data){
    //$response_data为服务器返回的数据
    //匿名回调函数中写你的业务
});

-----------------------------------------------------------------------------------------------------------------------------------------------

HTTP服务器

<?php
//引入服务器配置文件【必须实现】
include('server.ini');

//创建服务器【必须实现】
$http_serv = new Http_server($ip,$port);
/**
 *$ip为服务器监听ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Http_server('',9501);
 */

//当接收到请求数据时【必须实现】
$http_serv->receive(function($request_post,$request_get,$headers_message){
    //$request_post为客户端发送的post请求数据,$request_get为客户端发送的get请求数据;
    //$headers_message为获取头信息请求参数
    //匿名回调函数中写你的业务
    //如需给客户端返回数据请return $var
});

//处理task异步任务,具体操作请阅读异步任务部分文档【可选项】
$http_serv->task(function($request_post,$request_get,$task_id,$reactor_id){
    //$request_post为客户端发送的post请求数据,$request_get为客户端发送的get请求数据;
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//task异步任务完成事件【如启用task则必须实现】
$http_serv->finish(function($state,$task_id,$reactor_id){
    //$state为task异步任务运行结果状态,当$state等于true时,异步任务运行完成。
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//启动服务器【必须实现】
$http_serv->start();

HTTP客户端

<?php
//引入服务器配置文件【WEB服务器(FPM)运行无需实现  server服务的CLI模式运行必须实现】
include('server.ini');

//创建客户端【必须实现】
$http_cli = new Http_client($ip,$port);
/**
 *$ip为服务器ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Http_client('',9501);
 */

//像服务器发送数据并接收服务器返回数据【必须实现】
$result = $http_cli->post(['username'=>'easylt'],$headers);
//发送post请求,如无POST请求数据,请传入空数组[]即可。请求的URL请在config_swoole.php中配置;
//$headers为头信息请求参数,选填项,数据类型必须为array,且为一维数组,元素值用冒号分隔键值对,如:['Authorization:init']
//$result为服务器返回数据

$result = $http_cli->get('?username=easylt',$headers);
//发送get请求,如无GET请求数据,请传入空字符串''即可。请求的URL请在config_swoole.php中配置,这里仅跟URI参数,如:?username=easylt&work=frame
//$headers为头信息请求参数,选填项,数据类型必须为array,且为一维数组,元素值用冒号分隔键值对,如:['Authorization:init']
//$result为服务器返回数据

-----------------------------------------------------------------------------------------------------------------------------------------------

WebSocket服务器

<?php
//引入服务器配置文件【必须实现】
include('server.ini');

//创建服务器【必须实现】
$websocket_serv = new Websocket_server($ip,$port);
/**
 *$ip为服务器监听ip地址,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *$port为服务器端口号,选填项,当不填入时自动填入配置文件config_swoole.php中的常量值。
 *PS:当填入$ip时,必须填入$port;当填入$port时,可忽略$ip,如:new Websocket_server('',9501);
 */

//当客户端连接成功时触发【可选项】
$websocket_serv->connect(function($request_data,$fd){
    //$request_data为客户端发送的数据
    //$fd为客户端ID
    //匿名回调函数中写你的业务
    //如需给客户端返回数据请return $var
});

//当接收到请求数据时【必须实现】
$websocket_serv->receive(function($request_data,$fd){
    //$request_data为客户端发送的数据
    //PS:开发一对一发送消息业务时,客户端连接成功时服务器端将userid与socket-fd进行关联缓存到Redis,每次发送数据通过服务器端查询对方的fd并组装对象字符串JSON.stringify({fd:fd})发送给服务器,如果不发送fd则默认fd为自己;
    //$fd为客户端ID
    //匿名回调函数中写你的业务
    //如需给客户端返回数据请return $var
    //$websocket_serv->receive(function(){});的方法体中可实现一对一(单聊),一对多(群聊)业务,请在config_swoole.php中配置,默认为单聊模式。
});

//处理task异步任务,具体操作请阅读异步任务部分文档【可选项】
$websocket_serv->task(function($request_data,$task_id,$reactor_id){
    //$request_data为客户端发送的数据
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//task异步任务完成事件【如启用task则必须实现】
$websocket_serv->finish(function($state,$task_id,$reactor_id){
    //$state为task异步任务运行结果状态,当$state等于true时,异步任务运行完成。
    //$task_id为异步任务ID
    //$reactor_id为异步任务线程ID
    //匿名回调函数中写你的业务
});

//当客户端关闭成功时触发【可选项】
$websocket_serv->close(function($fd){
    //$fd为客户端ID
    //匿名回调函数中写你的业务
});

//启动服务器【必须实现】
$websocket_serv->start();

WebSocket客户端

  • 请参考以下示例:
  • 
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    <button type="submit" onclick="return send()">发送消息</button>
    <div id="div"></div>
    <script type="application/javascript">
    var lockReconnect = false;
    var wsUrl = "ws://127.0.0.1:80";//请更改公网ip:port
    //如果项目是HTTPS请求,请在Swoole配置文件中开启SSL并配置证书、密钥,更改公网ws://ip:port为wss://证书域名:port
    var tt = null;
    function createWebSocket(){
        try {
            websocket = new WebSocket(wsUrl);
            init();
        }catch(e){
            console.log('catch');
            reconnect(wsUrl);
        }
    }
    createWebSocket();
    
    function init(){
        //连接发生错误的回调方法
        websocket.onerror = function(){
            console.log("socket连接失败");
            //重连
            reconnect(wsUrl);
        };
        //连接成功建立的回调方法
        websocket.onopen = function(event){
            console.log("socket连接已打开");
            websocket.send('socket连接成功');//发送信息
            //心跳检测重置
            heartCheck.start();
        };
        //接收到消息的回调方法
        websocket.onmessage = function(event){
            console.log("后台接收到前台传送的值,还有心跳...");
            //心跳检测重置
            heartCheck.start();
            document.getElementById('div').innerHTML = event.data+'<br>';
        };
        //连接关闭的回调方法
        websocket.onclose = function(){
            console.log("socket连接已关闭");
            //重连
            reconnect(wsUrl);
        };
        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常;
        window.onbeforeunload = function(){
            websocket.close();
        };
    }
    
    function send(){
        //PS:开发一对一发送消息业务时,客户端连接成功时服务器端将userid与socket-fd进行关联缓存到Redis,每次发送数据通过服务器端查询对方的fd并组装对象字符串JSON.stringify({fd:fd})发送给服务器,如果不发送fd则默认fd为自己;
        var data = JSON.stringify({fd:1});
        websocket.send(data);//发送信息
        return false;
    }
    
    //重连函数
    function reconnect(url){
        if(lockReconnect){
            return;
        };
        lockReconnect = true;
        //没连接上会一直重连,设置延迟避免请求过多
        tt && clearTimeout(tt);
        tt = setTimeout(function (){
            createWebSocket();
            lockReconnect = false;
        },20000);
    }
    
    //心跳检测
    var heartCheck = {
        //每隔几秒测试一下心跳是否在继续
        timeout: 10000,
        timeoutObj: null,
        serverTimeoutObj: null,
        start: function(){
            console.log('开始测试心跳');
            var self = this;
            this.timeoutObj && clearTimeout(this.timeoutObj);
            this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
            this.timeoutObj = setTimeout(function(){
                //这里发送一个心跳,后端收到后,返回一个心跳消息;
                console.log('发送消息,测试后台是否运行中...');
                //任意发一个消息过去,后台接收,在init()中的onmessage收到消息,说明后台没有挂掉,有心跳;
                websocket.send('test');
                self.serverTimeoutObj = setTimeout(function(){
                    console.log("后台挂掉,没有心跳了....");
                    console.log("打印websocket的地址:"+websocket);
                    websocket.close();
                }, self.timeout);
            },this.timeout)
        }
    };
    
    //关闭连接
    function closeWebSocket(){
        websocket.close();
    }
    </script>
    </body>
    </html>