扫一扫浏览

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

未结贴
1 3052
鸿老大未认证 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
父元素flex之后,子元素高度自适应问题 5063
thinkphp5隐藏默认模块的一些问题 4574
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 4270
关于thinkphp5.0.x getshell漏洞的说明 4066
tpframe新建主题 4060
教你如果处理高并发数据不同步的问题php篇 3991
移动web资源整理,你值得收藏的干货 3823
omnicore rpc api中文手册【usdt】 3813
【全套视频】thinkphp5视频教程 3785
2018最新版PHP视频教程-ThinkPHP5商城系统+项目实战 3717
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
权限那里怎么一登录别的账号就报错啊 9
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
tpframe6.0马上就要跟大家见面了,一次全新的升级 5
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
thinkphp5自动完成操作,两次运行的详解 2