使用workerman搭建即时聊天

开发文档:http://doc2.workerman.net/

下载服务器端安装文件:

有windows版和linux版两个版本,我下载的linux版,在windows上也可以运行。

打开后有这些文件:

把这个文件放在服务器上或者项目中都可以,需要运行的就是最后一个start_for_win.bat文件。

运行成功。

修改start_gateway.php文件:

 1 <?php
 2 /**
 3  * This file is part of workerman.
 4  *
 5  * Licensed under The MIT License
 6  * For full copyright and license information, please see the MIT-LICENSE.txt
 7  * Redistributions of files must retain the above copyright notice.
 8  *
 9  * @author walkor<[email protected]>
10  * @copyright walkor<[email protected]>
11  * @link http://www.workerman.net/
12  * @license http://www.opensource.org/licenses/mit-license.php MIT License
13  */
14 use \Workerman\Worker;
15 use \Workerman\WebServer;
16 use \GatewayWorker\Gateway;
17 use \GatewayWorker\BusinessWorker;
18 use \Workerman\Autoloader;
19
20 // 自动加载类
21 require_once __DIR__ . ‘/../../vendor/autoload.php‘;
22
23 // gateway 进程,这里使用Text协议,可以用telnet测试
24 $gateway = new Gateway("websocket://0.0.0.0:8282");
25 // gateway名称,status方便查看
26 $gateway->name = ‘YourAppGateway‘;
27 // gateway进程数
28 $gateway->count = 4;
29 // 本机ip,分布式部署时使用内网ip
30 $gateway->lanIp = ‘127.0.0.1‘;
31 // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
32 // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
33 $gateway->startPort = 2900;
34 // 服务注册地址
35 $gateway->registerAddress = ‘127.0.0.1:1238‘;
36
37 // 心跳间隔
38 $gateway->pingInterval = 60;
39 // 心跳数据
40 $gateway->pingData = ‘{"type":"ping"}‘;
41
42 /*
43 // 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
44 $gateway->onConnect = function($connection)
45 {
46     $connection->onWebSocketConnect = function($connection , $http_header)
47     {
48         // 可以在这里判断连接来源是否合法,不合法就关掉连接
49         // $_SERVER[‘HTTP_ORIGIN‘]标识来自哪个站点的页面发起的websocket链接
50         if($_SERVER[‘HTTP_ORIGIN‘] != ‘http://kedou.workerman.net‘)
51         {
52             $connection->close();
53         }
54         // onWebSocketConnect 里面$_GET $_SERVER是可用的
55         // var_dump($_GET, $_SERVER);
56     };
57 };
58 */
59
60 // 如果不是在根目录启动,则运行runAll方法
61 if(!defined(‘GLOBAL_START‘))
62 {
63     Worker::runAll();
64 }

第24行,把tcp协议改为websocket协议;

第38行和40行,设置服务器向客户端发送的心跳时间,检测客户端是否连接,未连接将会断开。

下面的内容都是默认注释掉的,根据自己的需要打开或者修改。

再次运行start_for_win.bat文件:

协议就变为websocket协议了,现在就可以做项目内的操作了。

还需要再下载一个文件:https://github.com/walkor/GatewayClient

把这几个文件放进thinkphp的extend文件夹下(我用的是thinkphp5.0版本):

在Gateway.php的文件中方法几乎都写好了。

写了一个简单的前端页面:

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3     <head>
 4         <meta charset="UTF-8">
 5         <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6         <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7         <title></title>
 8     </head>
 9     <body>
10         <ul id="msgUl">
11             <li>ws://127.0.0.1:8282</li>
12         </ul>
13         <input type="" name="" id="sendValue" value="" />
14         <button type="button" id="sendButton">发送</button>
15
16         <div style="margin-top: 100px">
17             {volist name="msg" id="vo" empty="这里没有数据" key =‘s‘}
18                     <br/>
19                 <span>{$vo.user_name}:</span>
20                 <span>{$vo.msg}</span>
21                 <span>{$vo.createtime}</span>
22                     <br/>
23               {/volist}
24         </div>
25
26         <script src="http://www.zhihuapinpai.com/static/index/js/jquery-1.11.3.min.js"></script>
27         <script>
28             // var ws = new WebSocket("ws://123.56.216.232:8282");
29             var ws = new WebSocket("ws://127.0.0.1:8282");
30
31             ws.onopen = function() {
32                 $(‘#msgUl‘).append(‘<li>已连接上...</li>‘)
33                 sendValue();
34             };
35
36             ws.onmessage = function(evt) {
37                 $(‘#msgUl‘).append(‘<li>接收到:‘ + evt.data + ‘</li>‘)
38                 var obj = JSON.parse(evt.data);
39                 if (obj.type == ‘onConnect‘) {
40                     // 连接成功
41                     $(‘#msgUl‘).append(‘<li>client_id:‘ + obj.client_id + ‘</li>‘)
42                     $.ajax({
43                         type:"POST",
44                         url:"/index.php/api/Index/user_bind",
45                         data:{
46                             client_id:obj.client_id
47                         },
48                         dataType: "html",
49                         success: function(data){
50                             console.log(‘成功‘)
51                         }
52                     });
53                 } else if (obj.type == ‘ping‘) {
54                     // 心跳检测 不做任何处理
55                 } else if (obj.type == ‘chatGroup‘) {
56                     // 群组聊天
57                     $(‘#msgUl‘).append(‘<li>接收到:‘ + evt.data + ‘</li>‘)
58                 }
59             };
60
61             ws.onclose = function() {
62                 // console.log(‘连接已关闭...‘);
63                 $(‘#msgUl‘).append(‘<li>连接已关闭...</li>‘)
64             };
65
66             function sendValue() {
67                 $(‘#sendButton‘).click(function() {
68                     var thisValue = $(‘#sendValue‘).val();
69                     if (thisValue) {
70                         ws.send(thisValue);
71                         $(‘#msgUl‘).append(‘<li>发送数据:‘ + thisValue + ‘</li>‘)
72                         $.get("/index.php/api/Index/send_msg/msg/"+thisValue,function (data,status) {
73                             console.log(‘成功:‘+thisValue)
74                         });
75                     }
76                 })
77             }
78         </script>
79     </body>
80 </html>

第42—52行把client_id传到后台,与用户表中用户进行绑定。

后台代码:

 1 <?php
 2 namespace app\api\controller;
 3 use think\Controller;
 4 use GatewayClient\Gateway;
 5 use think\Db;
 6
 7
 8 class Index extends Controller
 9 {
10
11     public function websocket(){
12         $where=[];
13         $user_id=1;
14         $where[‘from_id|to_id‘]=$user_id;
15         $msg=Db::name(‘msg‘)->where($where)->select();
16         foreach ($msg as $key=>$val){
17             $msg[$key][‘createtime‘]=date(‘Y-m-d H:i:s‘,$val[‘createtime‘]);
18             $msg[$key][‘user_name‘]=Db::name(‘user‘)->where([‘id‘=>$val[‘from_id‘]])->value(‘name‘);
19         }
20         $this->assign(‘msg‘,$msg);
21         return view();
22     }
23
24     //绑定用户
25     public function user_bind($user_id=1){
26         //$user_id=1; //发送人用户id
27         $client_id = input(‘post.client_id‘);
28 //        $user=Db::name(‘user‘)->where([‘id‘=>$user_id])->find();
29         Gateway::bindUid($client_id, 1);
30         return $client_id;
31     }
32
33     //发送信息
34     public function send_msg(){
35         $msg=input(‘msg‘);
36         if($msg){
37             $data=[
38               ‘msg‘=>$msg,
39               ‘from_id‘=>1,
40               ‘to_id‘=>2,
41               ‘createtime‘=>time()
42             ];
43             Db::name(‘msg‘)->insert($data);
44             Gateway::sendToUid(1,$msg);
45             Gateway::sendToUid(2,$msg);
46         }
47         return ‘success‘;
48     }
49
50 }

发送消息存入数据库,页面显示即可。

原文地址:https://www.cnblogs.com/zrn-php/p/12001837.html

时间: 2024-08-27 00:25:18

使用workerman搭建即时聊天的相关文章

[Nodejs]利用Socket.IO配合Express4搭建即时聊天

Socket.IO为WebSockets这个较新的web技术提供了必要的支持,包含客户端与服务端模块,以便建立通信通道,当然也可作为中间件而存在. 1 创建一个express项目 ????????? ????? 防工具盗链抓取[如果显示此文字,代表来自第三方转发] freddon所有 ??? ??????????? 可以使用命令行初始化一个express项目 先安装express npm install express npm install express-generator express 

iOS通过SocketRocket实现websocket的即时聊天

之前公司的即时聊天用的是常轮循,一直都觉得很不科学,最近后台说配置好了socket服务器,我高兴地准备用asyncsocket,但是告诉我要用websocket,基于HTML5的,HTML5中提出了一种新的双向通信协议--WebSocket,本文尝试采用这种技术来实现以上的实时聊天功能. 在搜索了很多资料后,用square大神的SocketRocket进行实现,会比较简单,同时URL和端口,发送消息参数需要和后台约定好. 首先pod导入SocketRocket platform :ios, '7

即时聊天IM之二 openfire 整合现有系统用户

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:[email protected]  综述: 每天利用中午时间更新下这个知识点的的博客如果感兴趣的觉得更新慢了也别介意(其它时间还是以工作为主,学习工作两不误,哈哈……).上一篇我纯理论上简单讲解了一下XMPP协议,然而现在用的比较多的XMPP协议服务器当然是openfire最为流行(我感觉).至于如何搭建oprenfire 二次开发环

即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:[email protected] smack介绍: 上一篇我介绍了服务端openfire整合现有系统用户,当服务器整合并且搭建完成后,需要做的工作就是写客户端聊天工具了.要么基于pc要么基于移动(Android和IOS).所以这一篇我们一起学习一下smack库,smack是用java写的开源客户端XMPP (Jabber)库,在老版本

php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示. 2.长轮询,ajax请求服务端,服务端有数据会立即返回,服务端无数据时,会一直等待,直到有数据了才立即范围. 3.socket长连接. 特征分析: 方法1:实现起来最容易,定时重复请求服务端会产生无意义的http连接,消耗服务端资源,实时性较差. 方法2:实现起来较容易,会减少无效的ajax请求产生的http连接,能即时返回数据,但服务端会一直挂着,会消耗一定的资源,处理并发能力不强,比

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating-a-wpf-chat-client-server-application/ 注意:本教程是相当广泛的,如果你是在短请也看到我们的东西 开始和 如何在几分钟内创建一个客户端服务器应用程序教程. 注2:本例中包括,明显延长进一步证明功能,在包中包含的示例 包下载. 在我们开始之前确保您已经安装了Vis

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com

nodejs入门——搭建一个聊天室应用

个人博客 http://mvc.coding.io/ 1入门教程推荐 node入门 很早之前看的就是这个,比较浅显易懂,看一遍就明白nodejs到底是怎么一回事儿了 2开源项目 昨天在coding上看到了一个nodejs聊天室,fork了一份 nodejs聊天室 3环境搭建 nodejs官网,下载最新版本(本人电脑win7 64位),安装过程下一步下一步就行,安装会自动配置环境变量, 建议安装目录自己选择一下,别默认安装在C:\Program Files\ 目录下(目录有空格 会出现一些问题)

nodejs即时聊天

一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错,自己略加修改,感觉挺不错的.官网上给的例子很简单,下面改进了一点,实现了历史消息的推送. demo地址:chat.androiddevelop.cn 其中服务器端代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var history = new Ar