首页 > 其他分享 >WebSocket连接

WebSocket连接

时间:2024-04-01 17:13:15浏览次数:27  
标签:WebSocket String requireId void 连接 token import public

启动类增加注解并进行Bean注入

@EnableWebSocket

@Bean
public ServerEndpointExporter serverEndpointExporter() {
	return new ServerEndpointExporter();
}
package com.hwd.campus.security.biz.websocket;

import com.hwd.campus.security.biz.utils.WebsocketUtil;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

@Slf4j
@Getter
@ServerEndpoint("/ws/notify/{requireId}/{token}")
@Component
@EqualsAndHashCode
public class NotifyWebsocket {
    private Session session;
    private String token;
    private String requireId;
    private long timeStamp;

    @OnOpen
    public void onOpen(Session session, @PathParam("requireId") String requireId, @PathParam("token") String token) {
        this.session = session;
        this.token = token;
        this.requireId = requireId;
        WebsocketUtil.addNotify(this);
    }

    @OnClose
    public void onClose() {
        WebsocketUtil.delNotify(this);
    }

    @OnMessage
    public void onMessage(String message, @PathParam("requireId") String requireId, @PathParam("token") String token) {
        //处理中心
        log.info("来自客户端" + requireId + "的消息:" + message);
        sendMessage("收到来自客户端" + requireId + "的消息:" + message);
    }

    @OnError
    public void one rror(Throwable error) {
        log.error("websocket发生错误" + error);
    }

    /**
     * 发送消息
     *
     * @param message 消息
     */
    public void sendMessage(String message) {
        try {
            this.timeStamp = System.currentTimeMillis();
            log.info("发送消息给客户端:" + message);
            this.session.getAsyncRemote().sendText(message);
        } catch (Exception e) {
            log.error("发送消息失败" + e);
            //WebsocketUtil.delNotify(this);
        }
    }
}

工具类

package com.hwd.campus.security.biz.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.hwd.campus.security.biz.websocket.NotifyWebsocket;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CopyOnWriteArraySet;

@Slf4j
public class WebsocketUtil {
    private static final CopyOnWriteArraySet<NotifyWebsocket> NOTIFY_WEBSOCKET_LIST = new CopyOnWriteArraySet<>();

    public static void addNotify(NotifyWebsocket notifyWebsocket) {
        NOTIFY_WEBSOCKET_LIST.add(notifyWebsocket);
        log.info("有新连接加入数据通知服务,服务端当前在线人数为" + NOTIFY_WEBSOCKET_LIST.size());
    }

    public static void delNotify(NotifyWebsocket notifyWebsocket) {
        NOTIFY_WEBSOCKET_LIST.remove(notifyWebsocket);
        log.info("有新连接离开数据通知服务,服务端当前在线人数为" + NOTIFY_WEBSOCKET_LIST.size());
    }

    public static void sendNotifyMsg(String requireId, Object vo) {
        //根据requireId,相同的才发送信息
        if (NOTIFY_WEBSOCKET_LIST.size() == 0) {
            return;
        }
        //发送消息
        for (NotifyWebsocket notify : NOTIFY_WEBSOCKET_LIST) {
            long timeStamp = notify.getTimeStamp();
            long timeMillis = System.currentTimeMillis();
            if (timeStamp > timeMillis) {
                continue;
            }
            if (notify.getRequireId().equals(requireId)) {
                //发送信息
                log.info("已发送数据给" + notify.getRequireId());
                JSONConfig config = new JSONConfig();
                config.setDateFormat(DatePattern.NORM_DATETIME_PATTERN);
                notify.sendMessage(JSONUtil.toJsonStr(vo, config));
            }
        }
    }
}

线上环境可以在nginx配置文件增加如下配置

location /securityWs/ {
        proxy_pass http://192.168.3.152:8400/;
        proxy_redirect off;
        
        proxy_read_timeout 3600s;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

标签:WebSocket,String,requireId,void,连接,token,import,public
From: https://www.cnblogs.com/hhs-5120/p/18108897

相关文章

  • Xshell连接不上Ubuntu
    1ubuntu安装ssh服务器sudoaptinstallopenssh-server修改配置文件vi/etc/ssh/sshd_config修改如下两个配置修改完运行下面代码。再用xhell连接试试。/etc/init.d/sshrestart......
  • TCP连接的建立与关闭
    TCP是一种面向连接的单播(在计算机网络的传输中,目的地址为单一目标的一种传输方式)协议,在TCP中并不存在多播、广播这种行为,因为TCP报文中能明确发送方和接收方的IP地址。在发送数据之前,通信双方需要建立连接,发送完毕后,通信双方需要断开连接。TCP连接的建立和终止TCP的基本元素有......
  • websocket在线测试
    首先先在网页打开测试画面  http://www.jsons.cn/websocket/  然后根据系统进行连接按照格式进行连接连接参数用问好 记得跟token和需要的参数 中间用& 并且值用等号这个是连接上的画面根据系统 输入参数进行测试 输入参数和值 进行测试  ......
  • 本地服务器连接远程服务器上的MySQL
    上周日,在做项目时,连接不上远程服务器,导致数据库不能正常使用,(因为忘记密码了)查阅了很多资料,最终算是解决了吧。写一下自己的感悟。注意,本文是远程数据库的连接,所以是在远程服务器上工作的。我用的远程服务器是Linux系统,MySQL是5.7版本一、进入mysql需要密码,所以,我们得先跳过输......
  • 【数据库】使用DBever连接人大金仓数据库
    下载安装DBever首先需要下载并安装DBever,可以在DBever官网上下载最新版的安装程序,根据提示进行安装即可。下载驱动程序首先需要从人大金仓官方网站下载适用于DBever的驱动程序。下载完成后,将驱动程序保存到本地计算机上。添加驱动程序打开DBever软件,在主界面中点击菜单栏中的......
  • C#中的连接池管理
    连接池管理是在数据库编程和网络通信等领域中非常重要的一个概念,它可以提高应用程序的性能和资源利用率。以下是关于连接池管理的知识点以及可能会在面试中被问到的一些问题和答案:连接池管理的知识点:连接池的概念:连接池是一种管理和重用数据库连接、网络连接等资源的技术。......
  • 使用React 18和WebSocket构建实时通信功能
    1.引言WebSocket是一种在Web应用中实现双向通信的协议。它允许服务器主动向客户端推送数据,而不需要客户端发起请求。在现代的实时应用中,WebSocket经常用于实时数据传输、聊天功能、实时通知和多人协作等场景。在本篇博客中,我们将探索如何在React18应用中使用WebSocket来......
  • vscode远程连接docker容器打断点调试python项目
    vscode远程连接服务器docker容器前提:本地和远程都安装docker插件。1.安装完docker插件后点击插件图标2.如果登录的账号没有docker权限的会会报权限不足,使用以下命令把用户加到docker权限组中sudogpasswd-a<当前登陆用户名>docker#从用户组中删除:sudogpasswd-d<当前......
  • Android studio制作的mqtt协议通讯app,可用于搭建的meqx服务器,不可连接阿里云
    首先,在app目录下创建一个libs文件夹,导入相应的MQTT的jar包,然后右击jar包拉到最后找到Add...的一个选项,单击就OK了然后就是添加一些权限添加另一个layout的名字activity_main<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.......
  • nvl函数使外连接无法转换为内连接案例
    nvl函数使外连接无法转换为内连接案例编写:李晓萌sqlSELECTcount(0)FROM(SELECTz.GP3ZZHDMZHDM,a.C_PORT_NAMEZHMC,c.C_SEC_CODEZQDM,......