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

 1 //匿名聊天服务器
 2 //将新的消息POST到/chat地址,或者以GET形式从通一个URL获取文本或事件流
 3 //创建一个GET请求到"/"来返回一个简单的HTML文件,这个文件包括客户端聊天UI
 4 
 5 var http = require('http');
 6 
 7 //聊天客户端使用的HTML文件
 8 var clientUI = require('fs').readFileSync("chatClient.html");
 9 var emulation = require('fs').readFileSync("EventSourceEmulation.js");
10 
11 //ServerResponse对象数组,用于接收发送的事件
12 var clients = [];
13 
14 //每20秒发送一条注释至客户端
15 setInterval(function(){
16     clients.forEach(function(client){client.write(":ping?n")});
17 }, 20000);
18 
19 //创建一个新服务器
20 var server = new http.Server();
21 
22 //当服务器获取到一个新的请求,运行回调函数
23 server.on("request", function(request, response){
24     //解析请求的URL
25     var url = require('url').parse(request.url);
26     
27     //如果是"/",服务器就发送客户端聊天室UI
28     if(url.pathname === "/"){
29         response.writeHead(200, {"Content-Type":"text/html"});
30         response.write("<script>"+emulation + "</script>");
31         response.write(clientUI);
32         response.end();
33         return;
34     }
35     //如果是"/chat"之外的地址,则返回404
36     else if(url.pathname !== "/chat"){
37         response.writeHead(404);
38         response.end();
39         return;
40     }
41     
42     //如果请求类型为POST,那么就有一个客户端发送了一个新的消息
43     if(request.method === "POST"){
44         request.setEncoding("utf8");
45         var body = "";
46         // 在获取到数据之后,将其添加到请求主体中
47         request.on("data", function(chunk){body += chunk;});
48 
49         // 当请求完成时,发送一个空响应
50         request.on("end", function(){
51             response.writeHead(200);
52             response.end();
53 
54             message = 'data: '+body.replace('\n', '\ndata: ')+"\r\n\r\n";
55 
56              clients.forEach(function(client){client.write(message);});
57 
58          });
59     }
60     // 客户端请求一组消息
61     else {
62         response.writeHead(200, {"Content-Type":"text/event-stream"});
63         response.write("data: Connected\n\n");
64 
65         request.connection.on("end", function(){
66             clients.splice(clients.indexOf(response), 1);
67             response.end();
68         });
69 
70         //记下响应对象
71         clients.push(response);
72     }
73     
74 });
75 
76 //启动服务器
77 
78 server.listen(8000);
79 
80  

 

posted @ 2016-06-10 20:51  鱼泽弋海  阅读(498)  评论(0编辑  收藏  举报