netty-scoket.io路径配置
1、服务端代码
package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.store.RedissonStoreFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.annotation.PreDestroy;@Component
@Order(1)
public class SocketIOStart implements CommandLineRunner {private Logger logger = LoggerFactory.getLogger(SocketIOStart.class);private SocketIOServer server;private RedissonStoreFactory redissonStoreFactory;@Autowiredpublic SocketIOStart(SocketIOServer server, RedissonStoreFactory redissonStoreFactory) {this.server = server;this.redissonStoreFactory = redissonStoreFactory;}@Overridepublic void run(String... strings) throws Exception {logger.info("SocketIO Server starting...");server.start();}@PreDestroypublic void destory() {redissonStoreFactory.shutdown();server.stop();}}
package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;
import com.corundumstudio.socketio.listener.DefaultExceptionListener;
import com.corundumstudio.socketio.store.RedissonStoreFactory;
import com.corundumstudio.socketio.store.pubsub.PubSubStore;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SocketImConfig {private PubSubStore pubSubStore;private SocketIOServer server;private static final int imPort = 28888;@Beanpublic RedissonStoreFactory redissonStoreFactory(RedissonClient redissonClient) {return new RedissonStoreFactory(redissonClient);}@Beanpublic SocketIOServer socketIOServer(RedissonStoreFactory redissonStoreFactory) {com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();config.setPort(imPort);config.setStoreFactory(redissonStoreFactory);config.setExceptionListener(new DefaultExceptionListener());config.getSocketConfig().setReuseAddress(true);config.getSocketConfig().setSoLinger(0);config.getSocketConfig().setTcpNoDelay(true);config.getSocketConfig().setTcpKeepAlive(true);// 设置自定义路径 默认是 socket.ioconfig.setContext("/socket.io");//前端使用
// io.connect(url,{ transports: ["websocket"],path:"/aaaa"});////解决跨域问题config.setOrigin(null);server = new SocketIOServer(config);pubSubStore = server.getConfiguration().getStoreFactory().pubSubStore();return server;}@Beanpublic PubSubStore pubSubStore() {return pubSubStore;}@Beanpublic SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {return new SpringAnnotationScanner(socketServer);}}
2、没有nginx代理时客户端代码
var url = 'http://172.16.50.21:28888';//path:"/socket.io" 对应服务端设置的 config.setContext("/socket.io");var socket = io.connect(url,{ transports: ["websocket"],path:"/socket.io"});//var socket = io.connect(url,{ transports: ["websocket"]});
3、展示
4、nginx代理后,代理配置
location ^~/socket.io/ { proxy_pass http://172.16.50.21:28888;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;##此处Upgrade注意大小写proxy_set_header Connection "Upgrade";proxy_set_header Remote_addr $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 15s;proxy_send_timeout 3600s;proxy_read_timeout 3600s;}
5、代理后前端
var url = 'http://172.16.50.21';//path:"/socket.io" 对应服务端设置的 config.setContext("/socket.io");var socket = io.connect(url,{ transports: ["websocket"],path:"/socket.io"});//var socket = io.connect(url,{ transports: ["websocket"]});
6、变更路径 ,服务段代码
package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.store.RedissonStoreFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.annotation.PreDestroy;@Component
@Order(1)
public class SocketIOStart implements CommandLineRunner {private Logger logger = LoggerFactory.getLogger(SocketIOStart.class);private SocketIOServer server;private RedissonStoreFactory redissonStoreFactory;@Autowiredpublic SocketIOStart(SocketIOServer server, RedissonStoreFactory redissonStoreFactory) {this.server = server;this.redissonStoreFactory = redissonStoreFactory;}@Overridepublic void run(String... strings) throws Exception {logger.info("SocketIO Server starting...");server.start();}@PreDestroypublic void destory() {redissonStoreFactory.shutdown();server.stop();}}
package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;
import com.corundumstudio.socketio.listener.DefaultExceptionListener;
import com.corundumstudio.socketio.store.RedissonStoreFactory;
import com.corundumstudio.socketio.store.pubsub.PubSubStore;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SocketImConfig {private PubSubStore pubSubStore;private SocketIOServer server;private static final int imPort = 28888;@Beanpublic RedissonStoreFactory redissonStoreFactory(RedissonClient redissonClient) {return new RedissonStoreFactory(redissonClient);}@Beanpublic SocketIOServer socketIOServer(RedissonStoreFactory redissonStoreFactory) {com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();config.setPort(imPort);config.setStoreFactory(redissonStoreFactory);config.setExceptionListener(new DefaultExceptionListener());config.getSocketConfig().setReuseAddress(true);config.getSocketConfig().setSoLinger(0);config.getSocketConfig().setTcpNoDelay(true);config.getSocketConfig().setTcpKeepAlive(true);// 设置自定义路径 默认是 socket.ioconfig.setContext("/aaaa");//前端使用
// io.connect(url,{ transports: ["websocket"],path:"/aaaa"});////解决跨域问题config.setOrigin(null);server = new SocketIOServer(config);pubSubStore = server.getConfiguration().getStoreFactory().pubSubStore();return server;}@Beanpublic PubSubStore pubSubStore() {return pubSubStore;}@Beanpublic SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {return new SpringAnnotationScanner(socketServer);}}
7、没有nginx 代理,前端代码
var url = 'http://172.16.50.21:28888';var socket = io.connect(url,{ transports: ["websocket"],path:"/aaaa"});
8、前端展示
9、设置路径 nginx代理 根据官方文档配置不可行
文档 https://socket.io/zh-CN/docs/v4/reverse-proxy/