定制的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);
定制的Server-Sent Events 聊天服务器的更多相关文章
- [CareerCup] 8.7 Chat Server 聊天服务器
8.7 Explain how you would design a chat server. In particular, provide details about the various bac ...
- openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150 评论- ...
- sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...
- 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 ...
- 通过python 构建一个简单的聊天服务器
构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...
- 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。
一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...
- SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...
- 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...
随机推荐
- HDU 4588 Count The Carries 数学
Count The CarriesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...
- w3cmark前端精彩博文周报 10.20-10.27
w3cmark 官方Q群 145423956 | 官方微博 @w3cmark 自从最近微博屏蔽了我的站点域名,就很懒了.毕竟和不爽,一个纯技术站点还被认为不安全链接,还申诉无门,那些所谓的客服都是自动 ...
- gcc中不同namespace中同名class冲突时
正常情况下,编译器都会报错,提示你有两个候选类,让你明确的选择一个. 比如我的情况,我自己设计了一个类Message, 然后在某个文件里面引用了它.但是我的文件中又引入了mongodb的头文件,非常不 ...
- Asp.net生成随机不重复的函数(方法)
// 生成三位毫秒字串 public static string Get_mSec() { string mSec = System.DateT ...
- 实例源码--Android自定义Gallery动画效果
相关文档与源码: 下载源码 技术要点: 1.自定义控件的使用 2.Gallery控件的使用实例 3.详细的源码注释 ...... 详细介绍: 1.自定义控件的使用 本套源码通过自定义控件的方式,继 ...
- Scala Error: error while loading Suite, Scala signature Suite has wrong version expected: 5.0 found: 4.1 in Suite.class
准备给scala项目引入单元测试 <dependency> <groupId>org.scalatest</groupId> <artifactId>s ...
- iOS: 属性声明strong和retain竟然不一样
今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的.在诸多教程中都会讲到:声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在 ...
- Partitioning, Shuffle and sort
Partitioning, Shuffle and sort what happened? - Partitioning Partitioning is the process of determi ...
- ORACLE 导入导出操作
1.导入命令: imp userId/psw@orcl full=y file=D:\data\xxx.dmp ignore=y 2.导出命令 exp userId/psw@orcl file=d: ...
- CF Tanya and Postcard
Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...