@PostConstruct @DependsOn("mybatisPlusConfig") public void init() { // 如果开启了socket,则启动socket服务 boolean websocket = systemConfigService.selectAllConfig().get("websocket").toString().equals("1"); if (websocket) { com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); config.setHostname(systemConfigService.selectAllConfig().get("websocket_host").toString()); config.setPort(Integer.parseInt(systemConfigService.selectAllConfig().get("websocket_port").toString())); server = new SocketIOServer(config); // 添加监听 server.addConnectListener(client -> log.info("有新用户连接, SessionId: {}", client.getSessionId())); server.addDisconnectListener(client -> { String username = Constants.websocketUserMap.get(client.getSessionId().toString()).getUsername(); Integer userId = Constants.websocketUserMap.get(client.getSessionId().toString()).getUserId(); log.info("用户: {} 断开了连接", username); Constants.usernameSocketIdMap.remove(userId); Constants.websocketUserMap.remove(client.getSessionId().toString()); }); // 添加绑定本地用户与websocket用户的监听器 server.addEventListener("bind", Map.class, bindDataListener); server.start(); } }
@Bean public SocketIOServer socketIOServer() { Configuration config = new Configuration(); config.setHostname(host); config.setPort(port); return new SocketIOServer(config); }
public SocketIOServerLauncher() { Configuration config = new Configuration(); Config conf = ConfigFactory.load(); config.setHostname("0.0.0.0"); config.setPort(9979); if(conf.hasPath("socket-io")){ Config ioConfig = conf.getConfig("socket-io"); if(null!=ioConfig && null!=ioConfig.getString("hostname")){ config.setHostname(ioConfig.getString("hostname")); } if(null!=ioConfig && ioConfig.getInt("port")>0){ config.setPort(ioConfig.getInt("port")); } } config.setAckMode(AckMode.MANUAL); config.setTransports(Transport.WEBSOCKET); config.setAuthorizationListener(new MyAuthorizationListener()); //config.setStoreFactory(new RedissonStoreFactory()); server=new SocketIOServer(config); }
@PostConstruct private void init() { Configuration config = new Configuration(); config.setHostname(host); config.setPort(port); System.out.println("SocketServer start at host:"+host+", port:"+port); config.setAuthorizationListener(new AuthorizationListener() { @Override public boolean isAuthorized(HandshakeData data) { // String token = data.getHttpHeaders().get(HeaderFactory.HEADER_KEY_USER_TOKEN); String token = data.getSingleUrlParam(HeaderFactory.HEADER_KEY_USER_TOKEN); UserHeaderContainer container = UserHeaderContainer.resolveUserCookie(token); if (container.getUserId() <= 0) { logger.info("websocket握手失败 验证用户身份失败,container:{}", container); return false; } else { logger.info("websocket握手成功 login!!! id:{}, uuid:{}", container.getUserId(), container.getUuid()); return true; } } }); server = new SocketIOServer(config); // server.addNamespace("room1"); }
@Bean public SocketIOServer server(WsConfig wsConfig) { com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); config.setHostname(wsConfig.getHost()); config.setPort(wsConfig.getPort()); //这个listener可以用来进行身份验证 config.setAuthorizationListener(data -> { // http://localhost:8081?token=xxxxxxx // 例如果使用上面的链接进行connect,可以使用如下代码获取用户密码信息,本文不做身份验证 String token = data.getSingleUrlParam("token"); // 校验token的合法性,实际业务需要校验token是否过期等等,参考 spring-boot-demo-rbac-security 里的 JwtUtil // 如果认证不通过会返回一个 Socket.EVENT_CONNECT_ERROR 事件 return StrUtil.isNotBlank(token); }); return new SocketIOServer(config); }
@Bean public SocketIOServer socketIOServer() { /* * 创建Socket,并设置监听端口 */ com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); // 设置主机名,默认是0.0.0.0 // config.setHostname("localhost"); // 设置监听端口 config.setPort(myProperties.getSocketPort()); // 协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间 config.setUpgradeTimeout(10000); // Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔 config.setPingInterval(myProperties.getPingInterval()); // Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件 config.setPingTimeout(myProperties.getPingTimeout()); return new SocketIOServer(config); }
@Bean public SocketIOServer socketIOServer() { /* * 创建Socket,并设置监听端口 */ com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); // 设置主机名,默认是0.0.0.0 // config.setHostname("localhost"); // 设置监听端口 config.setPort(myProperties.getSocketPort()); // 协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间 config.setUpgradeTimeout(10000); // Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔 config.setPingInterval(myProperties.getPingInterval()); // Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件 config.setPingTimeout(myProperties.getPingTimeout()); // 握手协议参数使用JWT的Token认证方案 config.setAuthorizationListener(data -> { // 可以使用如下代码获取用户密码信息 String token = data.getSingleUrlParam("token"); return true; }); return new SocketIOServer(config); }