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

本文介绍了一个使用 Python 实现的简单服务器发送事件 (SSE) 的示例。通过自定义 EventCenter 类来管理事件监听和触发,实现了客户端与服务器之间的长连接通信。该实现包括了事件的创建、监听、触发及清理等功能。
摘要由CSDN通过智能技术生成






// 监听方

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();


转载于:https://my.oschina.net/u/867090/blog/1585790

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值