java服务端如何接入WebSocket?

这篇具有很好参考价值的文章主要介绍了java服务端如何接入WebSocket?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

日常工作中,我们都是使用http请求,来进行前后交互,那么我们也会有使用websocket来进行前后交互的时候,那么它俩有什么区别呢?

http和websocket区别

  1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
  2. HTTP是单向的
  3. WebSocket是需要浏览器和服务器握手进行建立连接的
  4. 而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接

根据它的特点就可以知道,如果场景中需要服务端向客户端推送消息,那么使用http就是不行的。所以今天就用spring boot 来接入 WebSocket。

代码实现

1、首先,我们需要在pom文件内引入它的jar包依赖,如下:

<!--websocket作为服务端-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

这个时候我们就可以直接利用该第三方的API直接代码实现了。

新增websocket配置类

因为项目中有http请求,也有websocket请求,那么该怎么去区分请求连接的类型呢?这个时候我们需要增加一个websocket的配置类,来进行拦截websocket的请求。

@Configuration
public class WebSocketConfig {

    /**
     * 注入ServerEndpointExporter,
     * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
     */

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

注意:不要忘记添加 @Configuration 注解,这个类,会自动拦截websocket请求。

完整代码

@Component
@Slf4j
@ServerEndpoint("/websocket/{userId}")
public class WebSocketHandler {
    // 接口路径 ws://127.0.0.1:9000/websocket/userId;
    private Session session;

    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
    private static CopyOnWriteArraySet<WebSocketHandler> webSocketUtils = new CopyOnWriteArraySet<>();
    // 用来存在线连接数
    private static Map<String, Session> sessionPool = new HashMap<>();

    /**
     * 链接成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        try {
            this.session = session;
            webSocketUtils.add(this);
            sessionPool.put(userId, session);
            sendOneMessage(userId, "连接成功");
            //加入队列
            QueueUtils.addMap(userId);

            log.info("【websocket消息】有新的连接,总数为:" + webSocketUtils.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 链接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        try {
            webSocketUtils.remove(this);
            log.info("【websocket消息】连接断开,总数为:" + webSocketUtils.size());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     * @param
     */
    @OnMessage
    public void onMessage(@PathParam(value = "userId") String userId, String message) {

        log.info("【websocket消息】收到客户端消息:" + message);
        if (!StringUtils.isEmpty(userId) && !StringUtils.isEmpty(message) && message.equals("ping")) {
            sendOneMessage(userId, "pong");
        } else {
            //1、轮询用户数最少的服务器IP
            String serverIP = QueueUtils.getServer();
            log.info("serverIP为:" + serverIP);
            //2、调用大模型
            WebSocketClient client = JavaClient.getClient(userId, serverIP);
            if (client != null) {
                JSONObject object = new JSONObject();
                object.put("", message);
                String[][] strings = {{"aaa"}};
                object.put("history", strings);
                object.put("knowledge_base_id", "/home/nemo/aigc/langchain-ChatGLM/vector_store/knowledge_FAISS_20230516_133609");
                //3、发送问题
                client.send(object.toString());

            }
        }
    }

    /**
     * 发送错误时的处理
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {

        log.error("用户错误,原因:" + error.getMessage());
        error.printStackTrace();
    }


    /**
     * 推消息给前端
     *
     * @param userId
     * @param message
     * @return
     */
    public static Runnable sendOneMessage(String userId, String message) {
        Session session = sessionPool.get(userId);
        if (session != null && session.isOpen()) {
            try {
                log.info("【推给前端消息】 :" + message);

                //高并发下,防止session占用期间,被其他线程调用
                synchronized (session) {
                    session.getBasicRemote().sendText(message);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

测试

我们可以使用第三方websocket在线测试工具,http://www.jsons.cn/websocket/,连进行测试。

我们可以发送请求连接为:ws://127.0.0.1:9000/websocket/1

然后点击Websocket连接,即客户端可以收到服务端的回应:连接成功。

java服务端如何接入WebSocket?文章来源地址https://www.toymoban.com/news/detail-479229.html

到了这里,关于java服务端如何接入WebSocket?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot-接入WebSocket服务

    1、注解@ServerEndpoint(\\\"/client/websocket/{deviceId}\\\") 2、地址参数与restful 风格一致 3、方法上通过获取地址参数 @PathParam( value = \\\"deviceId\\\") 4、方法getRemoteAddress() 可以获取客户端IP,如果是本机请求 则返回0.0.0.0.0.1 5、只能通过本地缓存对象sessionMap 存储session信息。 6、如果需要集群、分

    2024年02月20日
    浏览(36)
  • 【主流技术】日常工作中关于 JSON 转换的经验大全(Java)

    目录 前言 一、JSON 回顾 1.1结构形式 二、其它类型 - JSON相关 2.1 JavaBean 转 JsonObject 2.2 JavaBean 转 Json 字符串 2.3 List 转 JsonArray 2.4 List 转Json 字符串 2.5Map 转 Json 字符串 三、JSON 相关 - 其它类型 3.1 Json 字符串转 JavaBean 3.2 Json 字符串转 JsonObject 3.3 Json 字符串转 List 3.4Json字符串转M

    2024年03月11日
    浏览(44)
  • 【通用消息通知服务】0x3 - 发送我们第一条消息(Websocket)

    项目地址: A generic message notification system[Github] Websocket Connection Pool Websocket Provider websocket接口 结果截图

    2024年02月10日
    浏览(40)
  • java-websocket服务端、客户端及如何测试

    1. 导入依赖 2. 服务端实现 (1)基础版 (2)优化版 对String分片转换为Listbyte[] 3. 客户端实现 4. websocket服务端测试方法 (1)自己编写一个客户端 ​ 使用上面的java客户端就可以直接调用测试。 (2)使用postman测试 ​ postman版本需要在v8.0以上才有websocket的接口测试

    2024年02月11日
    浏览(52)
  • ChatGPT会如何影响我们的工作生活和人力资源需求

    ChatGPT,这几天体验了一下,确实是非常震撼。   一方面是因为它的回答确实相当好,自带一点框架逻辑,有上下文理解能力,可以追问,有情商。虽然很多时候都是一些正确的废话 它还有媲美一个普通大学生的信息整合能力,并且一秒钟就能回答你,它甚至还会写代码  

    2024年02月03日
    浏览(50)
  • 【netty】java如何作为websocket客户端 对服务端发起请求

    是的 本文介绍java如何作为客户端 发起websocket请求 博主不做标题党 不会服务端客户端分不清就写个标题 乱写文章 为什么会使用java作为websocket客户端? 虽说websocket协议 本意是web与服务端之间的通讯协议,那假设有一天 我们的供应商 或者是甲方大爷 只提供了websocket接口呢?

    2024年02月05日
    浏览(51)
  • java springboot 整合webSocket接入调用chatGPT3.5接口实现自由返回

    java springboot 中使用webSocket接入openAI接口调用chatGPT3.5接口实现自由返回 @Component @Anonymous @ServerEndpoint(“/websocket/{id}”) // 访问路径: ws://localhost:8080/websocket public class WebSocketServer { // try { // sendMessage(“WebSocket连接成功”); // } catch (Exception e) { // // } } /** * 发送消息 * @param message 要

    2024年02月14日
    浏览(59)
  • 服务器日常维护要素,应该如何做好维护

          维护服务器的目的是为了让服务器的性能保持最佳状态,发现问题及时解决,没有问题也可以对相关的应用和配置进行调优。但也有很多用户疑问,服务器具体会有哪些方面需要维护的,今天就一起来看看吧。 服务器日常维护,主要包含2块重要部分 第一块:服务器硬

    2024年02月02日
    浏览(49)
  • 数据之美:如何用数据可视化优化我们的日常生活?

    在这个信息爆炸的时代,我们周围充斥着各种数据,而数据可视化正是一种强大的工具,帮助我们更好地理解和利用这些信息。那么,如何将数据可视化应用在我们的日常生活中呢?让我们一起探索这个引人入胜的话题。 首先,让我们简单了解一下数据可视化的概念。数据可

    2024年02月02日
    浏览(62)
  • 通义听悟上线,强大的视频会议和学习直播分析能力,人工智能如何改变我们的生活和工作方式?

    通义听悟已开启公测,公测期(2023年6月1日至30日)用户可体验所有AI功能,含全文概要、章节速览、发言总结等高阶AI功能,通过阿里云主账号登录。 官方给的应用场景: 1、实时会议记录:线上、线下会议使用通义听悟实时呈现多语言字幕;会后检索关键内容,可结合录音

    2024年02月10日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包