WebSocket是一种网络通讯协定,一个TCP连贯的两端,能够同时给对方发送音讯,即反对全双工通信。比拟常见的利用场景就是服务端给客户端推送信息,绝对于轮询,WebSocket缩小了宽带资源节约,实时性更强。

WebSocket利用了HTTP协定,建设连贯之后,会先发一个非凡的HTTP申请过来,服务器发现这是个WebSocket的申请之后,就依照协定要求返回一个非凡的HTTP响应,通知客户端“我晓得你想用WebSocket了,咱们依照它的协定来工作吧”。而后TCP链接就不会断开了,留着发消息。所以说WebSocket只利用你原来的80端口(ws://)和443端口(wss://)就能够工作,不须要再开个端口。

咱们将应用以下框架 or 工具
IDEA 2021.1
Gradle 6.8.3
Spring Boot 2.3.10

1. 新建springboot我的项目

能够在 https://start.spring 生成springboot我的项目

2. build.gradle 增加 spring-boot-starter-websocket

plugins {    id 'org.springframework.boot' version '2.3.10.RELEASE'    id 'io.spring.dependency-management' version '1.0.11.RELEASE'    id 'java'    id 'idea'}group = 'com.ben'version = '0.0.1-SNAPSHOT'sourceCompatibility = '1.8'configurations {    developmentOnly    runtimeClasspath {        extendsFrom developmentOnly    }    compileOnly {        extendsFrom annotationProcessor    }}repositories {    maven{ url 'https://maven.aliyun.com/repository/public'}    mavenCentral()}dependencies {    implementation 'org.springframework.boot:spring-boot-starter'    implementation 'org.springframework.boot:spring-boot-starter-web'    implementation 'org.springframework.boot:spring-boot-starter-websocket'    implementation 'org.projectlombok:lombok:1.18.18'    testImplementation('org.springframework.boot:spring-boot-starter-test') {        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'    }}test {    useJUnitPlatform()}

WebSocket HelloWorld版构建

1. configuration 配置

在src/main目录下创立websocketdemo目录,而后创立MyWebsocketConfig.java

package com.ben.websocketdemo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublic class MyWebsocketConfig implements WebSocketConfigurer {    @Autowired    MyWebsocketHandler myWebsocketHandler;    @Override    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {        registry.addHandler(myWebsocketHandler,"/bensocket").setAllowedOrigins("*");    }}

留神下面的配置文件,两点

  • 增加注解 @EnableWebSocket 示意开启了webocket服务
  • registerWebSocketHandlers 这个办法用来注册websocket服务,下面示意将门路 /bensocket 的申请转发到 myWebsocketHandler

2. WebSocketHandler 解决类

myWebsocketHandler 能够实现了WebSocketHandler接口,在WebSocket连贯建设或者断开、收到音讯或者收到谬误的时候这些办法会被调用( 这里就不示范了 )。如果你感觉回调太多或者不好用,能够继承AbstractWebSocketHandler类,只实现本人想要的办法:

在src/main/websocketdemo目录创立MyWebsocketHandler.java

package com.ben.websocketdemo;import org.springframework.stereotype.Component;import org.springframework.web.socket.BinaryMessage;import org.springframework.web.socket.CloseStatus;import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.handler.AbstractWebSocketHandler;import java.nio.ByteBuffer;@Componentpublic class MyWebsocketHandler extends AbstractWebSocketHandler {    @Override    public void afterConnectionEstablished(WebSocketSession session) throws Exception {        System.out.println("afterConnectionEstablished");    }    // 发送文本音讯    @Override    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {         String msg = message.getPayload();        // 向客户端发送数据        session.sendMessage(new TextMessage("你好哦: " + msg));    }    // 发送二进制音讯    @Override    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {        ByteBuffer byteBuffer = message.getPayload();        session.sendMessage(new BinaryMessage(byteBuffer));    }    @Override    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {        System.out.println("afterConnectionClosed");    }}

返回数据则是借助WebSocketSession即与客户端之间的会话,来发送数据的

3. 测试

装置繁难的命令行WebSocket客户端

npm install -g ws wscat

npm 须要装置下nodejs 官网下载安装即可

而后执行

wscat -c ws://127.0.0.1:8080/bensocket

如果遇到提醒 零碎禁止运行脚本(win10)
解决办法: 以管理员形式关上powershell 运行命令:set-ExecutionPolicy RemoteSigned

既然两边能够收发音讯了,能够定义音讯格局,比较简单的做法是应用文本音讯,发送JSON对象。
也可应用 protobuf 来发送承受数据 前面有工夫再写个demo