(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com)

websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可以用于任意的客户端和服务器程序,

把上一个demo改装一下,变成一个简易聊天室,在不同的页面之间可以收到彼此send的内容,并且新增了上线提示和下线提示。如果新打开一个localhost:8080页面,我们就认为有新人加入,如果关闭了页面,就认为有人下线啦。

首先安装一下websocket,方法很简单啦,在命令行里输入 npm install websocket

页面只有一个chat.html,看一下前端页面的js核心代码

var wsClient = new WebSocket("ws://localhost:9090","chat-protocol");创建一个实例,这个端口,随便起,从0~65535理论上都行,但是3000之内的最好不要用,因为很多软件都有自己约定俗成的端口使用情况了。因为http server用了8080,所以WebSocketServer随手用了9090
wsClient.onopen = function(){
wsClient.send('____conn____');这就是接头暗号,类似于天王盖地虎,是初始化消息
}
wsClient.onmessage = function(msg){监听消息
console.log(msg);
if(msg.data){
var data = JSON.parse(msg.data);转化成json形式
var txt = document.querySelector("#chatRoom").value;
txt += "\n"+data.nickname+"说:"+data.message;
document.querySelector("#chatRoom").value = txt;显示在页面
}
}

以下是server端核心代码

var http = require("http");
var WebSocketServer = require("websocket").server;
var url = require("url");
var resource = require("./resource.js") 处理resource的部分拿出来了,复用代码块

http.createServer(function(req, res){
var oUrl = url.parse(req.url, true);
if(oUrl.pathname == '/favicon.ico'){     给页面地址栏加了个小图标
resource.getFile(oUrl.pathname,res);
}
else {
resource.getFile("/chat.html", res);  这里就是获取的前端的html页面
}
}).listen(8080);

var wsHttpServer = http.createServer(function(req,res){
res.writeHead(403);这个httpServer是给websocket用的,所以对于普通的http请求就返回403,这是个websocket server,普通http请求不受理,也可以返回404,或者其他的页面
res.end("NOT AUTH");
}).listen(9090);

var wsServer = new WebSocketServer({httpServer:wsHttpServer})这里new了一个新的WebSocketServer对象

var connections = [];

function broadcast(content) {  广播出去喽,每个页面都能收到
for(var i=0;i<connections.length;i++){
if(connections[i].connected)
connections[i].send(content);
}
}
wsServer.on('request',function(req){受理请求
var conn = req.accept("chat-protocol");
broadcast(JSON.stringify({nickname:'系统',message:'有人上线了'}));
var index = connections.push(conn)-1;
conn.on('message',function(msg){
if(msg.type == 'utf8'){
if(msg.utf8Data != '____conn____'){对一下暗号
var msg = JSON.parse(msg.utf8Data);
var content = JSON.stringify({nickname:msg.nickname,message:msg.message});
broadcast(content);
}
}
});
conn.on('close',function(){
connections.splice(index,1);
broadcast(JSON.stringify({nickname:'系统',message:"有人下线了"}))
});
});

写完启动下,在命令行输入node  chat_server.js,打开多个localhost:8080就可以欢乐的聊天了。

node.js+websocket实现简易聊天室的更多相关文章

  1. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  2. node+websocket创建简易聊天室

    关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...

  3. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  4. node.js + socket.io实现聊天室一

    前段时间,公司打算在社区做一个聊天室.决定让我来做.本小白第一次做聊天类功能,当时还想着通过ajax请求来实现.经过经理提示,说试试当前流行的node.js 和socket.io来做.于是就上网学习研 ...

  5. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  6. WebSocket实现简易聊天室

    前台页面: <html> <head> <meta http-equiv="Content-Type" content="text/html ...

  7. 小案例-WebSocket实现简易聊天室

    前言 在详解 HTTP系列之一讲到HTTP/2.0 突破了传统的"请求-问答模式"这一局限,实现了服务器主动向客户端传送数据.而本章将通过一种在单个TCP连接上进行全双工通信的协议 ...

  8. 基于WebSocket的简易聊天室

    用的是Flash + WebSocket 哦~ Flask 之 WebSocket 一.项目结构: 二.导入模块 pip3 install gevent-websocket 三.先来看一个一对一聊天的 ...

  9. Servlet WebSocket的简易聊天室

    添加依赖 <!-- websocket --> <dependency> <groupId>javax.websocket</groupId> < ...

随机推荐

  1. ASP.NET服务器控件使用之MultiView和View

    MultiView 控件是一组 View 控件的容器.使用它可定义一组 View 控件,其中每个 View 控件都包含子控件. 用 ActiveViewIndex 属性或SetActiveView 方 ...

  2. 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]

    前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...

  3. 第九课:js的类与继承

    因为本书是js的框架设计,因此观看本书的必须有js基础,看不懂,请不要觉得自己差.我也是看了5遍js高级程序设计,才能看懂这本书的. 有关js的构造函数,继承的方法大家可以去看js的高级程序设计,我这 ...

  4. java设计模式--原始模型模式

    简介 原始模型模式属于对象的创建模式.通过一个原型对象来指明要创建对象的类型,然后用复制原型对象的方法来创建出更多同类型的对象. Java所有的类都是从java.lang.Object类继承来的,Ob ...

  5. SQL中exists的使用方法

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...

  6. Xamarin.Forms——WebView技术研究

    在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...

  7. Spring 管理数据源

    Spring 管理数据源 不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不 ...

  8. Spring-事物传播行为

    spring事物的传播属性(7种) REQUIRED(默认) 业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. 存在事物,则使用当前事物 ...

  9. POJ 1470 Closest Common Ancestors

    传送门 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 17306   Ac ...

  10. EasyUI datagrid 格式化显示数据

    http://blog.163.com/ppy2790@126/blog/static/103242241201512502532379/ 设置formatter属性,是一个函数,格式化函数有3个参数 ...