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 MyWebso<span style="color:transparent">来源gaodai#ma#com搞*代#码网</span>cketHandler 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