1、webSocket是一种在单个TCP连接上进行全双工通信协议,即数据可以同时双向传输;
2、WebSocket是一种持久化网络通信协议,一次握手即可建立长连接(握手使用HTTP协议,所以不容易被屏蔽,能通过各种HTTP代理服务器),与HTTP协议不同,HTTP需要三次握手,并且无状态,即每次通信请求都是唯一的,通过session、cookie配对等方式来认识每次请求;
3、WebSocket可以实现服务器主动推送数据给客户端,即可以做到服务器端与客户端的实时通信,与HTTP协议不同,HTTP需要每次客户端发给请求,服务器端才会给出响应,不过基于HTTP也可实现实时通信技术,例如:轮询、长轮询、流化技术(不过有弊端);
4、可以发送文本、二进制数据,数据格式比较轻量,性能开销小;
5、不受同源策略限制,因此不必理会跨域问题;
6、与HTTP协议一样有着良好的兼容性,默认端口是80和443。
webSocket的最显著的应用特点就是实时,像常见的微信、QQ聊天室,股票基金走势等等,这些注重于实时数据的接收与发送都可以使用webSocket。
在发送HTTP请求的请求头中:
1. Connection和Upgrade字段会告诉服务器,客户端要对协议升级,升级成为WenSocket协议。
2. Sec-WebSocket-Key是一个Base64编码值,是由浏览器随机生成。
3. Sec-WebSocket-Version表示客户端所使用的协议版本。
在响应头中:
1. Connection字段表示协议已经升级。
2. Sec-WebSocket-Accept表明服务器接受了客户端的请求。
3. Upgrade字段表示协议升级成为了WenSocket协议。
下面的案例只是将客户端接收到服务器端的信息直接输出到了控制台,并没有做精美的页面来展示服务端消息。
使用node创建本地服务器
服务器端代码:
var Websocket = require('websocket').server
var http = require('http')
//监听8080端口,服务器启动时控制台输出,因为websocket第一次请求需要走HTTP协议,所以创建HTTP服务器
var httpServer = http.createServer().listen(8080, function(){
console.log('http://127.0.0.1:8080');
})
//创建Websocket实例
var wsServer = new Websocket({
httpServer: httpServer,
autoAcceptConnections: false
})
//监听请求
wsServer.on('request', function(request){
// request.accept()是拿到wsServer链接实例
var connection = request.accept()
// 监听到达服务器的消息事件
connection.on('message', function(msg){
//当有数据到达服务器即使用send()API向客户端发出数据
connection.send(msg)
})
})
客户端代码:
Document
在实现聊天室的案例里,只是将每一个websocket链接实例放进数组,再使用for循环向对应的客户端发送数据.看到这里我们可以小小的猜测一下为什么聊天软件的群聊为什么都有人数限制了?
服务器端代码:
var Websocket = require('websocket').server
var http = require('http')
var httpServer = http.createServer().listen(8080, function(){
console.log('http://127.0.0.1:8080');
})
var wsServer = new Websocket({
httpServer: httpServer,
autoAcceptConnections: false
})
var connectionArr = []
// 服务端向多个客户端群发消息
wsServer.on('request', function(request){
// request.accept()是拿到wsServer链接实例
var connection = request.accept()
//将所有wsServer链接实例放进数组,即形成链接池
connectionArr.push(connection)
// 监听到达服务器的消息事件
connection.on('message', function(msg){
//使用for循环实现链接池中的每一个链接向对应客户端发出消息
for(var i = 0;i
客户端代码与第一个案例无异:
Document