环境说明
服务器的是centos7
nginx版本nginx/1.20.1
springboot2.7.12
nginx安装教程点击这里
wss_6">微信小程序wss配置
如果您的业务是开发微信小程序, 请先进行如下配置。
https://img-blog.csdnimg.cn/img_convert/633ab385bce967d1e2936d6d0dbba104.png" alt="WX20240422-210531@2x.png" />
websocket_11">boot集成websocket
- maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- config配置文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;/*** @author mark* @description websocket配置* @date 2024-04-21*/
@Configuration
public class WebSocketConfig {/*** 自动注册使用了@ServerEndpoint注解声明的Websocket endpoint** @return*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}/*** 通信文本消息和二进制缓存区大小* 避免对接 第三方 报文过大时,Websocket 1009 错误* @return*/@Beanpublic ServletServerContainerFactoryBean createWebSocketContainer() {ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();// 在此处设置bufferSizecontainer.setMaxTextMessageBufferSize(10240000);container.setMaxBinaryMessageBufferSize(10240000);container.setMaxSessionIdleTimeout(15 * 60000L);return container;}
}
- websocket业务核心代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;/*** @author mark* ws://127.0.0.1:8768/jeecg-activiti-gateway/ws/playBack* wss://doc.zengzhang.vip:8768* @description 统计在线人数* @date 2024-04-21*/
@Slf4j
@Component
@ServerEndpoint(value = "/ws/playBack")
public class WebSocketServerPlayBack {/*** 记录链接在线数量**/private static final AtomicInteger onlineCount = new AtomicInteger(0);/*** 存放每个客户端对应的 WebSocketServer 对象**/private static CopyOnWriteArraySet<WebSocketServerPlayBack> webSocketSet = new CopyOnWriteArraySet<>();/*** 与某个客户端的连接会话,需要通过它来给客户端发送数据**/private Session session;/*** 心跳报文**/private static final String HEARTBEAT_PACKETS = "The heartbeat packets";/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session) {this.session = session;// 加入set中webSocketSet.add(this);// 在线数加1onlineCount.getAndIncrement();}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {// 从set中删除webSocketSet.remove(this);// 在线数减1onlineCount.getAndDecrement();}/*** 发生错误时调用*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("[历史数据回放] - WS 异常断开", session, error);}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {log.info("--000--" + message);if (HEARTBEAT_PACKETS.equals(message)) {log.debug("[消息订阅] - 心跳.");return;}// TODO 接收前端入参后的业务处理}/*** 群发自定义消息*/public static void sendInfo(String message) {for (WebSocketServerPlayBack item : webSocketSet) {try {item.sendMessage(message);} catch (IOException e) {log.error("[NVR 数据对接] - 数据推送异常, 数据: [{}].", message, e);continue;}}}/*** 指定会话推送** @param message*/public static void sendInfo(Session session, String message) {for (WebSocketServerPlayBack item : webSocketSet) {try {if (null != session && item.session.equals(session)) {item.sendMessage(message);}} catch (IOException e) {log.error("[数据对接] - 数据推送异常, 数据: [{}].", message, e);continue;}}}/*** 向链接推送消息** @param message* @throws IOException*/public void sendMessage(String message) throws IOException {log.info("sendMessage:{}", message);this.session.getBasicRemote().sendText(message);}}
- SwaggerConfig权限放开
// 授权不需要登录权限的URL
.antMatchers("/swagger*/**","/explain/**","/file/**",//这个是webscoket所需的配置"/ws/**","/push/**","/v2/api-docs","/webjars*//**").permitAll()
nginx_222">nginx配置
亲测可用,直接贴代码,大家可以直接拿来使用。
注意啦!!!你的域名需要在管理后台下载免费或付费的SSL证书。
upstream doc {server 127.0.0.1:8768 weight=1;
}
server {listen 443 ssl;server_name xxx.comlisten 80;ssl on;# 将下载的ssl证书配置在这里ssl_certificate /etc/nginx/conf.d/ssl/doc/doc.zengzhang.vip_bundle.crt;ssl_certificate_key /etc/nginx/conf.d/ssl/doc/doc.zengzhang.vip.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;gzip on;gzip_min_length 3k;gzip_comp_level 9;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary on;gzip_disable "MSIE [1-6]\.";root /usr/share/nginx/html;location / {proxy_pass http://doc;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
配置好后,直接重启nginx。
命令是:systemctl restart nginx
接下来,敲黑版,重点来啦!!!
没有配置wss的情况下,我们是这样与服务器端建立连接。
ws://xxx.com:8768/jeecg-activiti-gateway/ws/playBack
配置了wss情况下, 我们建立连接的方式是这样的。
wss://xxx.com:443/jeecg-activiti-gateway/ws/playBack
客户端 由之前的请求地址 ws://www.xxx.com:8768 改为了 wss://www.xxxx.com:443
这个点,需要特别注意啦!!! 本人花费4个小时, 终于找到原因。
如果对您有帮助, 多多点赞啦啦啦…
也可以支持一下作者的网站哦, 点击下方链接。
JeecgFlow