本文介绍了如何使用workerman实现实时聊天。 有一定的参考价值,有需要的朋友可以参考,希望对大家有帮助。
开发文档: http://doc2.workerman.net/
下载服务器端安装文件:
有两个版本: windows版和linux版。 我下载的linux版也可以在windows上运行。
打开后,有以下文件:
此文件可以放在服务器上,也可以放在项目中。 需要执行的是最后一个start_for_win.bat文件。
执行成功了。
要修改start_gateway.php文件? php
//*
* this文件is part of worker man。
*
*许可证under the MIT许可证
* forfullcopyrightandlicenseinformation,please see the MIT-LICENSE.txt
* redistributionsoffilesmustretaintheabovecopyrightnotice。
*
* @author walkor
* @版权所有walk or
* @link http://www.workerman.net/
* @ license http://www.open source.org/licenses/MIT-license.phpmitlicense
*/
use 工作器manworker;
useworkermanweb服务器;
use 网关工作器网关;
use 网关工作器业务工作器;
use WorkermanAutoloader;
//自动加载类
require _ once _ _ dir _.'/./vendor/autoload.PHP ';
//网关进程,这里是文本协议,可以在telnet上进行测试
$ gateway=new gateway (网络套接字://0.0.0. 033608282 );
//网关名称,status易于查看
$gateway-name='YourAppGateway ';
//网关进程数
$网关-计数=4;
//本机ip,分布式部署时使用内部网ip
$网关- lanip=' 127.0.0.1 ';
//如果内部通信开始端口$gateway-count=4,则开始端口为4000
//4000400140024003的4个端口一般用作内部通信端口
$网关-开始端口=2900;
//服务注册地址
$网关-注册地址=' 127.0.0.133601238 ';
//心率间隔
$网关- ping间隔=60;
//心率数据
$网关- ping data=' { ' type ' : ' ping ' };
/*
//设置客户端连接时通过连接的onWebSocketConnect (即websocket )握手时的回调
$网关-连接=function ($连接)。
{
$ connection-onwebsocketconnect=function $ connection,$http_header )
{
//这里判断连接源是否合法,不合法就可以断开连接
//$_SERVER['HTTP_ORIGIN']标识从哪个站点的页面到web套接字的链接已启动
if($_SERVER['HTTP_ORIGIN']!='http://kedou.workerman.net ' )
{
$connection-close (;
}
//onWebSocketConnect中提供了$_GET $_SERVER
//var_dump($_get,$_SERVER );
(;
(;
*/
//否则
在根目录启动,则运行runAll方法if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
第24行,把tcp协议改为websocket协议;
第38行和40行,设置服务器向客户端发送的心跳时间,检测客户端是否连接,未连接将会断开。
下面的内容都是默认注释掉的,根据自己的需要打开或者修改。
再次运行start_for_win.bat文件:
协议就变为websocket协议了,现在就可以做项目内的操作了。
还需要再下载一个文件:https://github.com/walkor/GatewayClient
把这几个文件放进thinkphp的extend文件夹下(我用的是thinkphp5.0版本):
在Gateway.php的文件中方法几乎都写好了。
写了一个简单的前端页面:
ws://127.0.0.1:8282发送
{volist name="msg" id="vo" empty="这里没有数据" key ='s'}
{$vo.user_name}:
{$vo.msg}
{$vo.createtime}
{/volist}
// var ws = new WebSocket("ws://123.56.216.232:8282");
var ws = new WebSocket("ws://127.0.0.1:8282");
ws.onopen = function() {
$('#msgUl').append('
已连接上...')sendValue();
};
ws.onmessage = function(evt) {
$('#msgUl').append('
接收到:' + evt.data + '')var obj = JSON.parse(evt.data);
if (obj.type == 'onConnect') {
// 连接成功
$('#msgUl').append('
client_id:' + obj.client_id + '')$.ajax({
type:"POST",
url:"/index.php/api/Index/user_bind",
data:{
client_id:obj.client_id
},
dataType: "html",
success: function(data){
console.log('成功')
}
});
} else if (obj.type == 'ping') {
// 心跳检测 不做任何处理
} else if (obj.type == 'chatGroup') {
// 群组聊天
$('#msgUl').append('
接收到:' + evt.data + '')}
};
ws.onclose = function() {
// console.log('连接已关闭...');
$('#msgUl').append('
连接已关闭...')};
function sendValue() {
$('#sendButton').click(function() {
var thisValue = $('#sendValue').val();
if (thisValue) {
ws.send(thisValue);
$('#msgUl').append('
发送数据:' + thisValue + '')$.get("/index.php/api/Index/send_msg/msg/"+thisValue,function (data,status) {
console.log('成功:'+thisValue)
});
}
})
}
第42—52行把client_id传到后台,与用户表中用户进行绑定。
后台代码:<?php
namespace appapicontroller;
use thinkController;
use GatewayClientGateway;
use thinkDb;
class Index extends Controller
{
public function websocket(){
$where=[];
$user_id=1;
$where['from_id|to_id']=$user_id;
$msg=Db::name('msg')->where($where)->select();
foreach ($msg as $key=>$val){
$msg[$key]['createtime']=date('Y-m-d H:i:s',$val['createtime']);
$msg[$key]['user_name']=Db::name('user')->where(['id'=>$val['from_id']])->value('name');
}
$this->assign('msg',$msg);
return view();
}
//绑定用户
public function user_bind($user_id=1){
//$user_id=1; //发送人用户id
$client_id = input('post.client_id');
// $user=Db::name('user')->where(['id'=>$user_id])->find();
Gateway::bindUid($client_id, 1);
return $client_id;
}
//发送信息
public function send_msg(){
$msg=input('msg');
if($msg){
$data=[
'msg'=>$msg,
'from_id'=>1,
'to_id'=>2,
'createtime'=>time()
];
Db::name('msg')->insert($data);
Gateway::sendToUid(1,$msg);
Gateway::sendToUid(2,$msg);
}
return 'success';
}
}
发送消息存入数据库,页面显示即可。
更多计算机编程相关知识,请访问:编程视频!!