文档章节

Nodejs 实现长链接,SSE, 服务端代码

BryanYang
 BryanYang
发布于 2017/12/06 17:27
字数 169
阅读 638
收藏 0






// 监听方

function (req, res) {
  var fileName = "." + req.url;
  if (fileName === "./stream") {
    res.writeHead(200, {
      "Content-Type":"text/event-stream",
      "Cache-Control":"no-cache",
      "Connection":"keep-alive",
      "Access-Control-Allow-Origin": '*',
    });
    res.write("retry: 10000\n");
    res.write("event: connecttime\n");

	this.eventCenter.addListener(req.queryString.id, function(res){
		if(res.data){
			req.write('data: ' + data);
		} else {
			req.end();
		}
	
	});
}
}



// 事件中心
EventCenter = function () {
	
	this.eventList = {};
	this.eventEntyties = []

	this.createEvent = function(){
		const event = new Event(this);
		this.eventEntyties.push(event);
		const eventId = event.id;
		this.eventList.eventId = [];
		return event;
	},

	this.addListener = function(eventId, cb){
		this.eventList[eventId].push(cb);
	}

	this._checkEvent = function(){
		this.eventEntyties.map(event => {
			if(timoout(event)){
				delete event;
			}
		})
		
	}

	setInterval(this._checkEvent, 1000)

	
}

Event = function(center){
	this.id = '',
	this.center = center;
}

Event.prototype.done = function(){
	this.center.eventList[this.id].map(fn => fn.call({}, {}));
	delete this.center.eventList[this.id];
}

Event.prototype.emit = function(data){
	if(this.center.eventList[this.id]){
		this.center.eventList[this.id].map(fn => fn.call({}, data))
	} else {
		throw Error('事件不存在,或者超时');
	}
	
}

// 事件生成和触发方
var event = this.eventCenter.createEvent({
	// 事件参数
	timeout: 20* 1000, // 20分钟

});
while(){
	var txt = '';
	try{
		event.emit({data: txt});
	}
	catch(e){

	}
	
}

event.done();


© 著作权归作者所有

BryanYang
粉丝 16
博文 165
码字总数 52036
作品 0
石景山
程序员
私信 提问
加载中

评论(0)

webSocket(二) 短轮询、长轮询、Websocket、sse

简介 Web Sockets定义了一种在通过一个单一的 socket 在网络上进行全双工通讯的通道。仅仅是传统的 HTTP 通讯的一个增量的提高,尤其对于实时、事件驱动的应用来说是一个飞跃。 通过Polling...

asyncnode
2019/09/29
0
0
详解如何实现在线聊天系统中的实时消息获取

序言 传统web浏览器应用采用客户端主动请求方式,只有在收到浏览器请求时服务端才返回消息,这种模式已经不能满足日益多样化的web应用需求,例如: 在线聊天系统:需要实时获取聊天消息。 实...

中间件小哥
2018/08/08
59
0
快速了解Electron:新一代基于Web的跨平台桌面技术

本文引用了作者“ ConardLi”的《用JS开发跨平台桌面应用,从原理到实践》一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的无私分享。 1、引言 现在开发IM应用动...

JackJiang2011
2019/06/14
0
0
快速了解Electron:新一代基于Web的跨平台桌面技术

1、引言 现在开发IM应用动不动就要求多端——即Android端、iOS端、PC端、Web端等,Android端和iOS端作为两种不同的移动端技术,单独开发和维护还能理解,PC端和Web端如果要单独开发那就有点头...

首席大胸器
2019/06/14
344
0
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)...

JackJiang-
2016/07/14
2.2K
4

没有更多内容

加载失败,请刷新页面

加载更多

一款提升IT运维工作效率的工具,你值得拥有!

IT运维的工作内容主要是负责服务器硬件配置、独立主机或虚拟化产品的开通维护、服务器日常运行监控和管理等,具体的要看企业对这个岗位的要求。 而像运维这样的岗位,我个人是推荐可以使用一...

欢乐马在开源
27分钟前
44
0
IDEA 多线程Debug

一、问题描述 在idea中的进行调试时,代码中有多线程,想对线程中的代码进行跟踪,代码如下: for (int i = 0; i < 5; i++) { final int index = i; exec...

Airship
31分钟前
19
0
jenkins 插件加速

参考:https://my.oschina.net/VASKS/blog/3106314 主要是自己创建一个nginx, 让jenkins从清华源下载。 以下是创建nginx的Dockerfile Dockerfile FROM nginxADD nginx.conf /etc/nginx/ngi......

杰仪
32分钟前
43
0
五分钟自学编程:怎样才能学好笔试面试最爱考察的算法

原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和...

黄小斜
36分钟前
24
0
面试题 11:旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋...

Oaki
42分钟前
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部