...
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