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>