//匿名聊天服务器
//将新的消息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. iOS小结

    一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放 ...

  2. C#多线程学习(一) 多线程的相关概念

    什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄 ...

  3. SparkSQLTest.scala

    /** * Created by root on 9/7/15. */ import org.apache.spark.SparkConf import org.apache.spark.SparkC ...

  4. Windows 之 获取管理员权限

    新建文本文档,写入如下内容: Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\*\shell\runas] [HKEY_CLASSES ...

  5. Linux 同步时间

    Linux里有2个时间: 硬件时间 系统时间 这2个时间不是同步的!如果有一天发现系统的时间不对了,可以分别看看这2个时间.硬件时间写在BIOS里,系统时间就是电脑显示的时间了. sudo hwclo ...

  6. Apache服务器中配置虚拟机的方法

    新浪微博虚拟机开发配置步骤及介绍.1.由于后面虚拟机中需要用到Rewrite所以先编辑Apache的conf目录下的httpd.conf文件.(可根据实际需要操作)添加mod_rewrite.so模块 ...

  7. [改善Java代码]构造函数尽量简化

    建议34: 构造函数尽量简化 我们知道在通过new关键字生成对象时必然会调用构造函数,构造函数的简繁情况会直接影响实例对象的创建是否繁琐.在项目开发中,我们一般都会制订构造函数尽量简单,尽可能不抛异常 ...

  8. 【转】istringstream、ostringstream、stringstream 类介绍 .

    http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html 好吧,懒死我算了

  9. hdu 2844 多重背包+单调队列优化

    思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1: #include<iostream> #include<algorithm&g ...

  10. mac端口占用查找进程并杀死

    查找端口port被占用的进程 lsof -i tcp:port 杀死进程pid kill -9 pid