共计 3823 个字符,预计需要花费 10 分钟才能阅读完成。
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
@EnableWebSocket
public 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;
@Component
public 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