在这篇文章中 我会 手把手 搭建一个 简易的聊天室 可以模拟允许多名用户聊天
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每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 回车
发现另外一个窗口也实时更新
——
一个简单的沟通聊天室就这样搭建好啦
当然你也可以加入更多信息比如用户的名字
用户加入 通知 欢迎大家展开思想