websocket

WebSocket的简单入门使用

前言:

最近开发过程中遇到对接外部接口数据,需要实时获取客流数据,数据放提供的是wc://ip:port/xxx 形式的接口,而不是传统意义上的http接口获取,故而简单探讨下该协议的基本使用和概念方便大家快速入门了解,如有不足还请多多指教哈~

简介:

1.什么是WebSocket?

WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。说白了也是一种通信协议,不同于传统的http请求协议以http:// 开头 该协议是以ws:// 开头,如果走ssl协议则类比https为wss:// 。

2.与http协议的区别

总结:http的每个请求的返回都是单独的无状态的,而websocket是长连接,类似qq聊天,可以双向通信实时返回数据具体如下:

1. 连接方式

HTTP:

  • 请求-响应模式:HTTP 是一种请求-响应协议。客户端发起一个请求,服务器处理请求并返回一个响应。每个请求和响应都需要独立的连接。
  • 无状态:每次 HTTP 请求都是独立的,不保留之前请求的状态。

WebSocket:

  • 全双工通信:WebSocket 允许在单一连接上进行双向实时通信。客户端和服务器可以在同一连接上同时发送和接收数据。
  • 持久连接:一旦 WebSocket 连接建立,它会保持开放状态,直到主动关闭。这允许持续的数据传输,而无需频繁重新建立连接。
2. 数据传输方式

HTTP:

  • 文本/数据:HTTP 主要用于请求和响应文本数据。虽然可以传输二进制数据,但通常是通过 Content-Type 头部指定格式。
  • 开销:每次请求和响应都包括完整的 HTTP 头部,增加了数据传输的开销和延迟。

WebSocket:

  • 消息传递:WebSocket 使用帧(frame)来传输数据,这使得数据传输更加高效。可以传输文本、二进制数据等。
  • 低开销:WebSocket 协议在数据传输过程中不需要像 HTTP 一样频繁地发送头部信息,减少了开销。
3. 性能

HTTP:

  • 延迟高:每个请求和响应都需要重新建立连接和传输头部信息,这增加了延迟。
  • 高开销:在频繁的请求-响应操作中,HTTP 头部的开销会显著影响性能。

WebSocket:

  • 低延迟:由于连接在建立后保持持久,可以减少延迟,适合需要实时数据的应用场景。
  • 高效传输:WebSocket 的帧机制和持久连接特性减少了传输开销,提高了效率。

3.websocket的使用场景

  1. 实时聊天应用
    • WebSocket 最常见的应用场景之一是实时聊天应用程序,如即时通讯工具、在线客服系统等。WebSocket 可以实现实时的消息传递,允许用户在没有延迟的情况下发送和接收消息。
  2. 实时数据展示和监控
    • 对于需要实时监控和展示数据的应用,比如股票市场报价、实时天气更新、交通状况跟踪等,WebSocket 可以提供即时更新的数据流,确保用户始终看到最新的信息。
  3. 在线游戏
    • 多人在线游戏通常需要实时的玩家交互和游戏状态同步。WebSocket 可以用来实现游戏服务器与客户端之间的双向通信,支持实时的游戏动作、事件传递和状态更新。
  4. 实时通知和提醒
    • 各种需要即时通知用户的应用,如社交网络的实时提醒、在线拍卖的竞价通知、新闻网站的即时推送等,都可以使用 WebSocket 来实现及时的通知功能。
  5. 在线投票和问卷调查
    • 在线投票系统或问卷调查平台可以利用 WebSocket 实时收集用户的投票或答案,并实时展示统计结果,使参与者能够看到实时的反馈。
  6. 实时地理位置跟踪
    • 需要实时跟踪和共享位置信息的应用,如物流追踪系统、地图导航应用等,可以使用 WebSocket 实时更新位置信息并提供导航指引。

总之,WebSocket 在需要实时、高效、双向通信的场景下具有明显的优势,可以大幅提升用户体验和系统的实时性能。

使用springboot搭建一个websocket服务demo:

创建传统的springboot项目即可,没有额外特殊的地方,仅仅需要引入一个额外的依赖。服务可以同时支持websocket请求和传统的http请求。大致分4个步骤。

1.引入Maven依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

2.加入WebSocket配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
@EnableWebSocket
public class WebsocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpoint() {
        return new ServerEndpointExporter();
    } 

}

3.创建WebSocket操作类

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {

    /**
     * 连接成功
     *
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功");
    }

    /**
     * 连接关闭
     *
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭");
    }

    /**
     * 接收到消息
     *
     * @param text
     */
    @OnMessage
    public String onMsg(String text) throws IOException {
        return "servet 发送:" + text;
    }
}

4.测试功能是否正常

找到springboot配置类将服务启动此时我的服务默认端口是8080
@SpringBootApplication(scanBasePackages = "com.zpc")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
启动完成后使用websocket测试地址,网上一般都有在线测试工具,这里使用的是这个↓,也有其他的地址,可以自行选择
http://www.websocket-test.com/

进去后页面如下

image-20240807144913471

至此,整个流程完全走通,websocket的长连接特性体现无疑。
关于websocket的nginx配置方式请参考本人主页《关于WebSocket的Nginx反向代理方式及配置无效避坑》~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值