扫一扫浏览

聊天工具Comet HTTP服务器推送框架之icomet的基本运用

未结贴
1 662
鸿老大未认证 2017-10-17 13:36:27
收藏

        icomet 是一个使用 C++ 语言开发的支持百万并发连接的 comet 服务器, 使用了 libevent 网络库. 支持并发连接数高, 内存占用少, 性能优越. 支持的浏览器和操作系统平台包括: Safari(iOS, Mac), Firefox/Chrome(Windows, Mac), IE6+。

项目主页: https://github.com/ideawu/icomet

测试客户端iCometClient4j:https://github.com/kyleduo/iCometClient4j

APP Demo示例:https://github.com/ideawu/icomet-demos

html案例:http://pan.baidu.com/s/1o8SMbpC

iComet 在 Web 系统和移动应用系统中的角色

iComet 的工作流程

icomet 分布式

icomet 本身没有分布式方面的工具. 我可以说一个思路: 1. 部署多台 icomet-server 实例. 2. 用户调用 sign 申请通道时, 根据 uid 哈希到其中一台. 3. 当往用户推送消息时, 根据uid哈希推送到他所在的那一台icomet-server上.

如果你可以开发, 那便写程序订阅 psub 接口, 在一个中心节点保存uid和icomet-server的对应关系(路由表).

支持百万并发连接 C1000K

需要两个步骤:

1.编译安装,运行
wget --no-check-certificate https://github.com/ideawu/icomet/archive/master.zip
unzip master.zip
cd icomet-master/
#开启服务
make
./icomet-server icomet.conf
# or run as daemon
./icomet-server -d icomet.conf # stop ./icomet-server icomet.conf -s stop #订阅 curl -v "http://127.0.0.1:8100/sub?cname=12" # open another terminal 发布 curl -v "http://127.0.0.1:8000/push?cname=12&content=hi"
2.客户端html的使用(long-pulling.html)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>iComet long-polling demo</title>
<script src="/web/js/jquery-1.9.1.js"></script>
<script src="/web/js/icomet.js"></script>
</head>
<body>
<h3>Server push messages:</h3>
<div id="output"></div>
<script>
var count = 0;
var comet = new iComet({
channel : 'testChannel',
subUrl : 'http://192.168.10.58/icomet/sub',
callback : function (content, type) {
count ++;
var output = document.getElementById('output');
var time = '' + (new Date());
output.innerHTML += count + '. ' + time + ': (' + type + ') ' + content + '<br/>';
}
});
</script>
</body>
</html>

3、怎么去使用

## How to Use?

1. start icomet-server

2. open long-polling.html in web browser(Firefox, Chrome, Safari, etc)

3. open a command line terminal, execute

curl "http://127.0.0.1:8000/icomet/push?cname=testChannel&content=内容"

用浏览器的话,OK,先打开long-pulling.html进行监听,然后再打开另外一个窗口或浏览器访问http://127.0.0.1:8000/icomet/push?cname=testChannel&content=内容,其中cname是聊天的频道,只能跟相对应的频道发消息,content就是消息内容。

4、项目中如何使用(PHP)

不同的系统换不同的方式结成,道理都一样,tp3,tp5,yii2, laravel5...自己去搞定,我这里以tpframe(tp5来举例)

单聊OR群聊??? 不管是哪种,你知道原理了都知道怎么做,反正都是频道号为准,如果是单聊(两个人),那就单独开一个频道号,两人加入,如果群聊,须要聊天的人只须要进行创建好的频道就可以了,我这里以单聊为例说明一下,主要代码:

<?php
// +----------------------------------------------------------------------
// | Author: yaoyihong <510974211@qq.com>
// +----------------------------------------------------------------------
namespace app\frontend\controller;
use \tpfcore\Core;
class IComet extends FrontendBase
{
    /*
        创建聊天频道方法,开启会话的人首先要进入的页面
        频道号可以用某种方式创建(保证唯一),存入数据库之类的,方便其它人加入该频道聊天,我这里随便写一个频道用于测试
    */
    public function createChannel()
    {
        $this->view->engine->layout(false);
    	return $this->fetch("chat",[
            'channelName'=>"channel20158"
        ]);
    }
    /*
        添加进入聊天频道
        其实addChat与createChannel可以弄一起,实际项目可以去进行改进
    */
    public function addChat()
    {
        $this->view->engine->layout(false);
        return $this->fetch("chat",[
            'channelName'=>"channel20158"
        ]);
    }
    /*
        发送消息
        很简单的一个发送,要数据要怎么处理,自己去实现
    */
    public function sendMsg()
    {
        $channelName=input("channelName");
        $content=input("content");
        $result=file_get_contents("http://192.168.10.58/icomet/push?cname=$channelName&content=$content");
        return json_decode($result,true);
    }
}

然后就可以用浏览器打开:http://192.168.10.58/Icomet/createChannel创建一个频道

然后新开窗口访问http://192.168.10.58/frontend/Icomet/addChat加入频道进行聊天,图我就不上了

OK,自己去进行一些基本的改进就可以进行单聊或群聊了。

最后附上配置文件代码(我是用nginx搭建的)

在server{}之间加上:

location ~ ^/icomet/sse|sub|see.* {
    rewrite ^/icomet/(.*) /$1 break;

    proxy_read_timeout 60;
    proxy_connect_timeout 60;
    proxy_buffering off;
    proxy_pass   http://127.0.0.1:8100;
}
location ~ ^/icomet/push|sign.* {
    rewrite ^/icomet/(.*) /$1 break;

    proxy_read_timeout 60;
    proxy_connect_timeout 60;
    proxy_buffering off;
    proxy_pass   http://127.0.0.1:8000;
}

参考文章:http://blog.csdn.net/zhu_tianwei/article/details/43953657

有问题欢迎一起研究。。。

  • 007 007 4
    2017-09-04 11:36:20
    @tpframe测试: 应该把你的代码加上如下的Html
    <div class="jieda-reply">
         <!--<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em></span>-->
          <span type="reply"><i class="iconfont icon-svgmoban53"></i>回复</span>
     </div>

    现在问题应该不大了

    回复
最近热帖 HOT TOPIC
【全套视频】thinkphp5视频教程 1250
thinkphp5隐藏默认模块的一些问题 1114
TPFrame框架robot模块重磅来袭,内附2.1版本 1063
教你如果处理高并发数据不同步的问题php篇 1055
tpframe安装教程 1051
tpframe新建主题 995
slide模块发布 994
tpframe应用目录结构 988
thinkphp5自动完成操作,两次运行的详解 975
TPFrame 2.1 beta版本正式发布,全部插件式开发到来 929
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
新增的管理员没有权限操作CMS模块。 3
thinkphp5自动完成操作,两次运行的详解 2
tpframe-curd操作之添加数据 2
tpframe能带给你的,让你快速搞定各服务端(api,pc,mobile,wechat)代码的框架 2
slide模块发布 2
透析thinkphp5升级版开发框架tpframe 2
tpframe v2.2自动生成文档easydoc插件已发布 2
爆料早知道:又拍云存储插件上线我有好想法