定制的Server-Sent Events 聊天服务器

 //匿名聊天服务器
//将新的消息POST到/chat地址,或者以GET形式从通一个URL获取文本或事件流
//创建一个GET请求到"/"来返回一个简单的HTML文件,这个文件包括客户端聊天UI var http = require('http'); //聊天客户端使用的HTML文件
var clientUI = require('fs').readFileSync("chatClient.html");
var emulation = require('fs').readFileSync("EventSourceEmulation.js"); //ServerResponse对象数组,用于接收发送的事件
var clients = []; //每20秒发送一条注释至客户端
setInterval(function(){
clients.forEach(function(client){client.write(":ping?n")});
}, 20000); //创建一个新服务器
var server = new http.Server(); //当服务器获取到一个新的请求,运行回调函数
server.on("request", function(request, response){
//解析请求的URL
var url = require('url').parse(request.url); //如果是"/",服务器就发送客户端聊天室UI
if(url.pathname === "/"){
response.writeHead(200, {"Content-Type":"text/html"});
response.write("<script>"+emulation + "</script>");
response.write(clientUI);
response.end();
return;
}
//如果是"/chat"之外的地址,则返回404
else if(url.pathname !== "/chat"){
response.writeHead(404);
response.end();
return;
} //如果请求类型为POST,那么就有一个客户端发送了一个新的消息
if(request.method === "POST"){
request.setEncoding("utf8");
var body = "";
// 在获取到数据之后,将其添加到请求主体中
request.on("data", function(chunk){body += chunk;}); // 当请求完成时,发送一个空响应
request.on("end", function(){
response.writeHead(200);
response.end(); message = 'data: '+body.replace('\n', '\ndata: ')+"\r\n\r\n"; clients.forEach(function(client){client.write(message);}); });
}
// 客户端请求一组消息
else {
response.writeHead(200, {"Content-Type":"text/event-stream"});
response.write("data: Connected\n\n"); request.connection.on("end", function(){
clients.splice(clients.indexOf(response), 1);
response.end();
}); //记下响应对象
clients.push(response);
} }); //启动服务器 server.listen(8000);
上一篇:Mod4-PHP编码规范


下一篇:BZOJ_1020_[SHOI2008]_安全的航线flight_(计算几何+二分)