在这篇文章中 我会 手把手 搭建一个 简易的聊天室 可以模拟允许多名用户聊天
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
(From wikipedia)
在谈论 websocketz之前 我们写概括一下HTTP 于服务器的交互模式
polling:
HTTP 和 服务器沟通 是单向的通讯协议
只允许客户端 发出request 服务器才能给response
因此我们如何能得到客户端的消息呢 就只能不断地 发送请求给服务器 然后得到消息 这就是一个缺点
Long Polling:
这样重复的发送请求很费空间 又不能迅速得到反馈
因此 基于AJAX的long polling 派出了一个request 直到有消息 或者 timeout 才会回来
那我们来看看WebSocket:
既然HTTP这么麻烦 费时间
那么我们重启一个 基于 HTML5的协议 构造一个双边通讯
服务器 和 浏览器 双边都可以发讯息给对方 这样节省时间 又节省空间
Client 和 Server
我们在这就要创造俩个文件 一个承接Client 一个承接Server
然后这俩个文件可以有 沟通
导入ws
并且创造一个 ws 的 instatnce
用一个listener 去监控每一个 接入 我们这个 server的 socket
如果连接成功 返回一句话
var WebSocketServer = require("ws").Server; var wss = new WebSocketServer({ port: 3000 }); wss.on("connection", function(ws) { ws.send("Welcome to cyber chat"); });
创造这个client之前
我们要有一个HTML文件去承接这个服务器
然后 我们client的文件如下:
1. 一个是 SetTitle 改变Title
如果我们的聊天室连接成功 有一行Title 能显示 Connected
如果断开连接 就是 Disconnect
var ws = new WebSocket("ws://localhost:3000"); ws.onopen = function() { setTitle("Connected to Cyber Chat"); }; function setTitle(title) { document.querySelector('h1').innerHTML = title; }
在termial中安装 ws 之后
运行server文件
打开HTML 文件
如果我们在termial 中 ^c 这个文件 断开连接
我们能发现聊天室 显示为 disconnect
为了要促成能实时聊天
我们要在用户上传聊天的同时 更改 html中的信息 因此在client 文件中 我们更改为
document.forms[0].onsubmit = function () {
var input = document.getElementById('message');
ws.send(input.value);
input.value = '';
};
在这段代码中
只要user 输入了消息
我们把消息传回 server
var ws = new WebSocket("ws://localhost:3000"); ws.onopen = function() { setTitle("Connected to Cyber Chat"); }; ws.onclose = function() { setTitle("DISCONNECTED"); }; ws.onmessage = function(payload) { printMessage(payload.data); }; document.forms[0].onsubmit = function () { var input = document.getElementById('message'); ws.send(input.value); input.value = ''; }; function setTitle(title) { document.querySelector('h1').innerHTML = title; } function printMessage(message) { var p = document.createElement('p'); p.innerText = message; document.querySelector('div.messages').appendChild(p); }
当Client把文件send back 到我们的服务器
我们服务器要处理这个 信息, 把他加入HTML中
wss.clients 是一个js array 装在用户信息
我们要将某一个 用户发送的信息 发送给所有用户
我们遍历这个array 然后用server 发送信息给所有array
var WebSocketServer = require("ws").Server; var wss = new WebSocketServer({ port: 3000 }); wss.on("connection", function(ws) { ws.on("message", function(message) { if (message === 'exit') { ws.close(); } else { wss.clients.forEach(function(client) { client.send(message); }); } }); ws.send("Welcome to cyber chat"); });
我们打开俩个窗口关于这个HTML 的URL
然后在一个窗口输入Hello 回车
发现另外一个窗口也实时更新
——
一个简单的沟通聊天室就这样搭建好啦
当然你也可以加入更多信息比如用户的名字
用户加入 通知 欢迎大家展开思想