websocket和传统http协议
http
概念
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是基于TCP/IP协议来传输数据的,是Web浏览器和Web服务器之间进行数据交换的标准协议。
HTTP协议的主要特点包括:
简单易用:HTTP协议使用简单,易于开发和调试。
无状态:HTTP协议是一种无状态协议,即服务器不会记住之前客户端的请求信息,每个请求都是独立的。
可扩展:HTTP协议支持各种不同的请求方式和响应类型,同时也可以通过HTTP头部来传递自定义数据。
明文传输:HTTP协议传输的数据是明文的,因此可能会存在安全问题。
支持缓存:HTTP协议支持缓存机制,可以通过缓存来提高性能。
支持虚拟主机:HTTP协议支持虚拟主机,可以将多个域名映射到同一个IP地址上。
总之,HTTP协议在互联网通信方面发挥了重要作用,是Web应用开发不可缺少的基础。
原理图
websocket
概念
WebSocket是一种网络协议,它使浏览器和服务器之间建立持久性的连接,可实现双向通信。与HTTP协议不同,WebSocket建立一条TCP连接后,之后的数据传输都在这一条连接上进行,不需要重新建立连接。WebSocket协议还支持发送二进制数据、文本数据和ping-pong消息以实现心跳保活等。 WebSocket通常用于实时性要求较高的应用,如在线游戏、股票行情、即时消息等。
原理图
websocket和传统http比较
HTTP和WebSocket是客户端与服务器之间的通信协议,二者有以下优缺点对比:
优点:
HTTP:
可靠性高:HTTP是基于TCP协议的,可以保证数据传输的可靠性。
兼容性好:HTTP协议的版本升级不会影响旧版本的使用,向下兼容性好。
安全性好:HTTP协议可以与SSL/TLS协议相结合,保证数据传输的安全性。
WebSocket:
实时性好:WebSocket与HTTP相比,具有实时性更强的优势。
效率高:WebSocket可以减少HTTP协议中的握手开销和头部信息,提高数据传输效率。
跨域支持好:WebSocket可以跨域支持数据传输,实现跨域数据传输更加方便。
缺点:
HTTP:
传输速度慢:HTTP的传输速度相对较慢,由于每个请求都需要建立和释放连接。
实时性差:HTTP无法满足实时性要求高的场景,特别是在推送数据时,效率较低。
WebSocket:
兼容性差:WebSocket协议在IE浏览器中的兼容性较差。
安全性差:由于WebSocket不是基于HTTP协议的,因此安全性存在一定的问题。
状态维护难度大:WebSocket需要服务器端维护客户端的状态,增加了服务器端的负担。
总的来说,HTTP协议更适合静态数据的传输和请求,WebSocket协议更适合实时性和大量数据传输的场景。选择协议要根据场景需求来决定。
springboot整合websocket实战
环境搭建
pom文件
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置类
@Configuration
public class WebSocketConfig {/*** 注入ServerEndpointExporter,* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}@Beanpublic ServletServerContainerFactoryBean createWebSocketContainer() {ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();container.setMaxTextMessageBufferSize(8192 * 40);container.setMaxBinaryMessageBufferSize(8192 * 40);return container;}}
业务编写
@Component
@Slf4j
@ServerEndpoint("/websocket/")
public class RealTimeDataWebsocket {/*** 链接成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam(value = "userId") String userId) {// todo 初始化逻辑(进行一些记录等)}/*** 收到客户端消息后调用的方法* 收到的消息结果** @param message* @param*/@OnMessagepublic void onMessage(String message, Session session, @PathParam(value = "userId") String userId) {// todo 业务逻辑,第一个参数位置支持byte[]}/*** 发送错误时的处理** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {// todo 错误逻辑}/*** 链接关闭调用的方法*/@OnClosepublic void onClose(@PathParam(value = "userId") String userId) {// todo 关闭逻辑}// 想客户端发送消息public void sendOneMessage(String userId, String message) {}
}
测试
测试websockethttps://blog.csdn.net/weixin_44808225/article/details/134272651?spm=1001.2014.3001.5501