软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > >
聊天工具Comet HTTP服务器推送框架之icomet的基本运用
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2017-10-17 点击:375

        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

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

对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈