跟老姚学前端,课程体系更完善,10%基础 + 90%实战演练,快人一步学编程

扫一扫浏览

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

未结贴
1 6067
鸿老大站长未认证 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视频教程 97450
父元素flex之后,子元素高度自适应问题 11829
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 11402
如何收废品才能赚钱,有什么技巧?揭秘垃圾回收行业的一些规则 11174
thinkphp5隐藏默认模块的一些问题 10846
api接口文档插件easydoc的基本用法,快速搞定接口文档 10671
PHP如何判断字符串是否为json格式 10524
校园跑腿市场目前怎么样?校园跑腿系统给学生带来了哪些便捷? 10503
omnicore rpc api中文手册【usdt】 10444
教你如果处理高并发数据不同步的问题php篇 10165
月度热议HOT COMMENTS
【全套视频】thinkphp5视频教程 77
tpframe 后续版本你希望有的功能是什么(分享贴) 12
权限那里怎么一登录别的账号就报错啊 9
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
tpframe6.0马上就要跟大家见面了,一次全新的升级 5
透析thinkphp5升级版开发框架tpframe 3
新增的管理员没有权限操作CMS模块。 3
爆料早知道: