一个最简单基于spring的websocket服务端+客户端实现案例

1、服务端

代码分为两部分:

一个是服务器终端类:用java注解来监听连接@ServerEndpoint、连接成功@OnOpen、连接失败@OnClose、收到消息等状态@OnMessage

java 复制代码
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@Component
@ServerEndpoint("/websocket/fqa")
public class QwenWebSocket {

    @OnOpen
    public void onOpen(Session session){
        System.out.println("WebSocket opened: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session){
        System.out.println("Message received: " + message);
        try{
            session.getBasicRemote().sendText("Echo: " + message);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    @OnClose
    public void onClose(Session session){
        System.out.println("WebSocket closed: " + session.getId());
    }

    @OnError
    public void onError(Throwable t){
        t.printStackTrace();
    }
}

一个是websocket的配置类,用于把spring中的ServerEndpointExporter对象注入进来

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    /**
     * 这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket,如果你使用外置的tomcat就不需要该配置文件
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

2、客户端

普通的java工程即可,不需要是spring。

java 复制代码
import javax.websocket.*;
import java.net.URI;


@ClientEndpoint
public class MyWebSocketClient {

    @OnOpen
    public void onOpen(Session session){
        System.out.println("Connected to server");
    }

    @OnMessage
    public void onMessage(String message){
        System.out.println("Received message: " + message);
    }

    @OnClose
    public void onClose(CloseReason reason){
        System.out.println("Closing: " + reason.getReasonPhrase());
    }

    public static void main(String[] args) {
        try{
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            URI uri = URI.create("ws://localhost:8080/websocket/fqa");
            Session session = container.connectToServer(MyWebSocketClient.class, uri);
            session.getBasicRemote().sendText("I'm client!");
            Thread.sleep(10000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

3、效果

客户端显示:

Connected to server

Received message: Echo: I'm client!

服务端显示:

WebSocket opened: 4

Message received: I'm client!

WebSocket closed: 4

相关推荐
篱笆院的狗3 分钟前
Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
java·开发语言
与秋逐鹿¥24 分钟前
在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊
java·tomcat·mybatis
异常君35 分钟前
Netty Reactor 线程模型详解:构建高性能网络应用的关键
java·后端·netty
学习OK呀1 小时前
日常代码中加解密技术的使用
java·后端
Dcs1 小时前
Java 消息代理:企业集成的 5 项基本技术
java
木昜先生1 小时前
知识点:深入理解 Java 虚拟线程(Project Loom)
java·后端
SimonKing1 小时前
白嫖!开源Java图片验证码框架加固业务安全
java·后端·架构
ApeAssistant1 小时前
Spring + 设计模式 (十八) 行为型 - 责任链模式
spring·设计模式
AronTing1 小时前
分布式缓存架构优化与实战:从设计到落地
java·后端·面试
parade岁月1 小时前
Spring Boot配置中YAML文档结构的理解
java·spring boot