websocket网络协议
WebSocket是一种在单个TCP连接上进行全双工通信的网络协议。它提供了一种在客户端和服务器之间进行实时、双向通信的方式,允许服务器主动向客户端推送数据,而不需要客户端发起请求。
相比于传统的HTTP请求-响应模式,WebSocket协议具有以下特点:
双向通信:WebSocket协议允许客户端和服务器之间进行双向通信,可以在任意一方发送消息而不受请求-响应的限制。
实时性:WebSocket提供了实时性的通信,允许服务器主动向客户端推送数据,无需等待客户端的请求。
低延迟:由于WebSocket使用单个TCP连接,避免了建立和断开连接的开销,可以实现更低的延迟和更高的性能。
轻量级:WebSocket协议的头部开销相对较小,数据传输效率高,适用于移动设备和低带宽网络环境。
WebSocket协议在Web应用程序中广泛应用,特别适用于实时聊天、实时数据更新、多人协作和实时游戏等场景。它提供了一种更高效、更实时的通信方式,改善了Web应用程序的用户体验和交互性。
需要注意的是,WebSocket是一种独立的协议,不同于HTTP协议。它使用不同的通信头部和协议格式。但是,WebSocket握手过程使用HTTP协议,通过HTTP的Upgrade请求进行协议升级,之后切换到WebSocket协议进行通信。这种握手过程使得WebSocket能够通过大部分防火墙和代理服务器。
websocket 出现的问题
# was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint
Mixed Content: The page at '' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://'. This request has been blocked; this endpoint must be available over WSS. (anonymous) Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
因为HTTPS是基于SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,所以在HTTPS站点调用某些非SSL验证的资源时浏览器可能会阻止。比如使用ws://***调用websocket服务器或者引入类似http://***.js的js文件等都会报错。这里简述一下连接websocket服务器时的错误及解决方案。当使用ws://连接websocket服务器时会出现类似如下错误:
解决方案:
#首先将客户端请求websocket时的地址更改为wss:
//代理服务器url(代理服务器必须支持https) 例如
var ws = new WebSocket("wss://tiku.toolkit.show/socket/web/message");
2
3
#在代理服务器上的nginx配置文件中的server中增加如下配置项
location /socket/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; #请求头设置升级参数 将http 升级成websocket
proxy_set_header Connection "upgrade";
}
#http中增加
upstream backend{
server 服务器的ip:端口;
}
2
3
4
5
6
7
8
9
10
11
12
13