项目开发之Nginx_push_stream_module使用

Nginx_push_stream是针对nginx开发的第三方服务器推送模块,可以使用它来搭建服务器端的推送服务。项目在https://github.com/wandenberg上,

由于项目需要所以看了下作者的几个小的例子,对该模块有了基本了解吧。。简单记录下自己的学习心得吧。。模块的安装就参看官网上的教程就可以了。

项目搭建好后可以把其中 example 和 js 目录复制到项目测试地址查看数据和测试。提供的pushstream.js文件。功能也很强大

首先项目下提供了三个例子包括:Forever Ifram \ EventSource \Websocket

ForverIframe:使用轮询方式,在与服务端建立连接后可以看到,客户端代码不断的发出轮询查询,服务端是否有消息,如果有的话就会取出来。

EventSource 很显然是事件驱动模型,而且目前主流的浏览器也支持该功能.该功能只有当服务端有事件发生,才会更新客服端请求取消息,也就是名符其实的

服务器端推送技术了。

Websocket 是HTML5提出了浏览器的WebSocket API。
WebSocket的主要作用是,允许服务器端与客户端进行全双工(full-duplex)的通信。举例来说,HTTP协议有点像发电子邮件,发出后必须等待对方回信;WebSocket则是像打电话,服务器端和客户端可以同时向对方发送数据,它们之间存着一条持续打开的数据通道。websocket现在最流行的实现就是socket.io了。

下面是配置文件信息:nginx.conf文件

location /pub {
         push_stream_publisher admin;
         push_stream_channels_path               $arg_id;
    }

    location ~ /sub/(.*) {

        push_stream_subscriber;
        push_stream_channels_path                   $1;
        push_stream_header_template                 "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">    \r\n<meta http-equiv=\"Cache-Control\" content=\"no-store\">\r\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\r\n<meta http-eq    uiv=\"Pragma\" content=\"no-cache\">\r\n<meta http-equiv=\"Expires\" content=\"Thu, 1 Jan 1970 00:00:00 GMT\">\r\n<script type=\"text/jav    ascript\">\r\nwindow.onError = null;\r\ntry{ document.domain = (window.location.hostname.match(/^(\d{1,3}\.){3}\d{1,3}$/)) ? window.locat    ion.hostname : window.location.hostname.split('.').slice(-1 * Math.max(window.location.hostname.split('.').length - 1, (window.location.h    ostname.match(/(\w{4,}\.\w{2}|\.\w{3,})$/) ? 2 : 3))).join('.');}catch(e){}\r\nparent.PushStream.register(this);\r\n</script>\r\n</head>\    r\n<body>";
        push_stream_message_template                "<script>p(~id~,'~channel~','~text~');</script>";
         push_stream_footer_template                 "</body></html>";
        #push_stream_message_template                "{\"id\":~id~,\"channel\":\"~channel~\",\"text\":\"~text~\"}";
         default_type                                "text/html; charset=utf-8";
     }
     location ~ /ev/(.*) {
          push_stream_subscriber eventsource;
        push_stream_channels_path                   $1;
        push_stream_message_template                "{\"id\":~id~,\"channel\":\"~channel~\",\"text\":\"~text~\"}";
 
    }
测试文件: index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Event Source Example</title>
</head>
<body>
<p>Messages:</p>
<div id="messages" style="width:800px;height:300px;overflow:scroll;"></div>

<script src="/js/pushstream.js" type="text/javascript" language="javascript" charset="utf-8"></script>
<script type="text/javascript" language="javascript" charset="utf-8">
// <![CDATA[
 function messageReceived(text, id, channel) {
           document.getElementById('messages').innerHTML += id + ': ' + text + '<br>';
 };
var pushstream = new PushStream({
host: window.location.hostname,
port: window.location.port,
modes: "eventsource"
});
pushstream.onmessage = messageReceived;
pushstream.addChannel('ch1');
pushstream.connect();
// ]]>
</script>
</body>
</html>
~             
这些都可以在项目文件中和文档说明中招到,然后最后的效果图。。。。


效果图示2:


上次使用了nodejs+socket.io的方式搭建了私人聊天,这里也简单的比较下吧,

node+socket.io方案:

使用很方便,搭建也比较简单,可以方便灵活根据自己的需要调整,但是需要自己管理服务端的socket进行发送和接收的控制。

nginx_push_stream_module:

使用pub/sub模式,管理简单,但是灵活性就不那么高,比如发送时间过去可能就需要截取信息里面的内容了,所以扩展性不是很好。

当然,自己也是刚了解了下,所以研究的不深,也许有更强大的功能我还没发掘出来吧。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值