//匿名聊天服务器
//将新的消息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);

定制的Server-Sent Events 聊天服务器的更多相关文章

  1. [CareerCup] 8.7 Chat Server 聊天服务器

    8.7 Explain how you would design a chat server. In particular, provide details about the various bac ...

  2. openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...

  3. 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150  评论- ...

  4. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系

    原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...

  5. Writing a Discard Server 写个抛弃服务器 世上最简单的协议

    Netty.docs: User guide for 4.x https://netty.io/wiki/user-guide-for-4.x.html The most simplistic pro ...

  6. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  7. 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。

    一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...

  8. SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...

  9. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

随机推荐

  1. 使用TopShelf轻松开发Window服务

    关于TopShelf 描述: Topshelf is a framework for hosting services written using the .NET framework. The cr ...

  2. 通过ulimit改善linux系统性能(摘自IBM)

    本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 用法.通过这篇文章,读者不仅能够了解 ulimit 所起的作用.而且能够学会怎样更好地通过 ulimit 限制资源的使 ...

  3. Android 开发之旅:深入分析布局文件&又是“Hello World!”

    http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...

  4. [Javascript] Either Functor

    Either Functor: // API Right(val) // resolve the value Left(val) // return error message Examples: m ...

  5. MySQL 5.7 参数 – log_timestamps

    http://www.ttlsa.com/mysql/mysql-5-7-kengdieparam-log_timestamps/ 官网原话: This variable was added in M ...

  6. pydev+python+Eclipse环境搭建+ 调试快捷键汇总

    http://www.cnblogs.com/Bonker/p/3584707.html 编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就可以通用了,学 ...

  7. [ZZ]C++中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  8. 全面谈谈Aspects和JSPatch兼容问题

    1. 背景 Aspects 和 JSPatch 是 iOS 开发中非常常见的两个库.Aspects 提供了方便简单的方法进行面向切片编程(AOP),JSPatch可以让你用 JavaScript 书写 ...

  9. BootStrap2学习日记4---常用标签与样式

    <small>:常常和h1标签一起搭配使用 如<h1>标题<small>小标题</small></h1> <abbr>:abbr ...

  10. C# 之 获取服务器IP,客户端IP以及其它

    1.获取客户端IP:Request.ServerVariables.Get("Remote_Addr").ToString(); 2.获取客户端主机名:Request.Server ...