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
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(8192 * 40);
container.setMaxBinaryMessageBufferSize(8192 * 40);
return container;
}
}
业务编写
@Component
@Slf4j
@ServerEndpoint("/websocket/")
public class RealTimeDataWebsocket {
/**
* 链接成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam(value = "userId") String userId) {
// todo 初始化逻辑(进行一些记录等)
}
/**
* 收到客户端消息后调用的方法
* 收到的消息结果
*
* @param message
* @param
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam(value = "userId") String userId) {
// todo 业务逻辑,第一个参数位置支持byte[]
}
/**
* 发送错误时的处理
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
// todo 错误逻辑
}
/**
* 链接关闭调用的方法
*/
@OnClose
public void onClose(@PathParam(value = "userId") String userId) {
// todo 关闭逻辑
}
// 想客户端发送消息
public void sendOneMessage(String userId, String message) {
}
}