文章目录
前言
关于websocket一点知识
JavaWebSocket实现简单实时聊天窗口
一、什么是WebSocket
WebSocket是一种能在单个TCP连接进行全双工通信的协议
二、关于WebSocket
1.特点
a.客户端和服务端完成一次握手即可建立持久性连接
b.服务端可以主动推送信息到客户端
c.协议标识符:ws和wss(加密)(类似http和https)如ws://localhost:8888
d.基于tcp协议实现容易,发送数据多样(文本,二进制)
e.无同源限制也就是没有跨域(服务端可以第一次的Origin请求字段来判断是否通过该请求)
#只使用http进行一次握手,只有一次http请求,如下图,一次连接,多次数据交互
2.与HTTP
同:
和http一样都是应用层的协议,但websocket是为了弥补http在持久性连接的不足
基于TCP协议(算得上是互补的兄弟)
异:
http是一个request对应一个response,websocket是建立连接后就可以随便发
http不能从服务端推送,而websocket可以(HTTP/2也具备服务器推送功能,但HTTP/2 只能推送静态资源,无法推送指定的信息)
http无状态,websocket应该有状态(无状态协议是指比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登录该网站,但是服务器并不知道客户关闭了一次浏览器)(没找到相关资料,有大佬知道的话希望解答一下)
3.应用场景
主要利用长连接和全双工通信的特点,建立连接后发送数据开销比http小
实时通信,多人游戏…(实时)
三、其他
1.没有websocket之前怎样获取服务端单方面发送数据
ajax轮询:不断请求服务端,有消息就返回,没有也返回
long poll:请求服务端,直到服务端有发消息了(阻塞),才返回
(就是浏览器一直请求服务端,看看有没有消息,有就返回)
2.心跳机制
WebSocket 可能进入某种半死不活的状态(连接断开/无法正常使用,但客户端和服务端都没有感知到)
设置心跳机制,客户端和服务端定时发送特定数据以检测对方是否存活
(有点像注册中心和服务之间的心跳机制)
3.websocket 和 socket
WebSocket 是应用层协议
Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口.(简单来说,Socket是一层抽象,上接应用层,下接运输层(TCP/UDP))
4.连接鉴权
5.断线重连
四、参考
https://juejin.cn/post/7020964728386093093
https://www.runoob.com/html/html5-websocket.html
https://www.zhihu.com/question/20215561
https://baike.baidu.com/item/%E5%A5%97%E6%8E%A5%E5%AD%97/9637606?fromtitle=socket&fromid=281150&fr=aladdin