关于java:IDEA-Spring-Boot-Gradle-websocket-入门笔记

12次阅读

共计 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

正文完
 0