springboot创建websocket服务端
1.配置类
package com.neusoft.airport.websocket;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;import java.text.SimpleDateFormat;
import java.util.Date;
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}@Beanpublic ServletServerContainerFactoryBean createWebSocketContainer() {ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();container.setMaxTextMessageBufferSize(10240000);container.setMaxBinaryMessageBufferSize(10240000);container.setMaxSessionIdleTimeout(15 * 60000L);return container;}}
2.通讯类server
package com.neusoft.airport.websocket;import com.alibaba.fastjson.JSONObject;import com.neusoft.caeid.upms.license.LicenseSetting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.PongMessage;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;@Component
@ServerEndpoint("/webSocket/{sid}")
public class WebSocketServer implements EnvironmentAware {private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);private static int onlineCount = 0;private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();private ScheduledExecutorService executor= Executors.newSingleThreadScheduledExecutor();private static Environment globalEnvironment;private String sid="";private Session session;@Autowiredprivate Environment environment;@OnOpenpublic void onOpen(Session session,@PathParam("sid") String sid) throws IOException {for (WebSocketServer item : webSocketSet) {if (item.sid.equals(sid)) {webSocketSet.remove(item);subOnlineCount(); break;}}this.session = session;this.environment = globalEnvironment;webSocketSet.add(this); addOnlineCount(); log.info("有新用户连接,连接名:"+sid+",当前在线人数为" + getOnlineCount());this.session.getAsyncRemote().sendPing(ByteBuffer.wrap(new byte[0]));this.sid=sid;}@OnClosepublic void onClose() {webSocketSet.remove(this); subOnlineCount(); log.info("连接关闭:"+sid+"当前在线人数为" + getOnlineCount());}@OnMessagepublic void onMessage(String message, Session session) {log.info("收到来自:"+sid+"的信息:"+message);
for (WebSocketServer item : webSocketSet) {try {LicenseSetting.CheckParams checkParams = LicenseSetting.getCheckParams();log.info("当前证书信息: "+ JSONObject.toJSONString(checkParams));if(null!=checkParams.getLicenseParams()){checkParams.getLicenseParams().setSysMessageInfo(null);}String sendMessageStr = JSONObject.toJSONString(checkParams);if(checkParams.getStatus()==0){log.info("证书验证成功!");}else {log.error("证书验证失败!");}item.sendMessage(sendMessageStr);} catch (IOException e) {log.error("推送消息到:"+sid+",推送内容出错",e);continue;}}}@OnErrorpublic void onError(Session session, Throwable error) {log.error("发生错误",error);}@OnMessagepublic void onPong(PongMessage pong, Session session, @PathParam("sid") String sid) {executor.schedule(() -> {try {session.getAsyncRemote().sendPing(ByteBuffer.wrap(new byte[0]));} catch (IOException e) {log.error("Ping 用户:{} 心跳异常,关闭会话,错误原因:{}", sid, e.getMessage());onClose();}}, 10, TimeUnit.SECONDS);}public void sendMessage(String message) throws IOException {this.session.getAsyncRemote().sendText(message);}public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {for (WebSocketServer item : webSocketSet) {try {log.info("推送消息到:"+item.sid+",推送内容:"+message);if(sid==null||sid.length()==0) {item.sendMessage(message);}else if(item.sid.equals(sid)){item.sendMessage(message);}} catch (IOException e) {log.error("发生错误",e);continue;}}}public static boolean sendInfoBySid(@PathParam("sid") String sid,String message) throws IOException {boolean result=false;if(webSocketSet.size()==0){result=false;}for (WebSocketServer item : webSocketSet) {try {if(item.sid.equals(sid)){item.sendMessage(message);log.info("推送消息到:"+sid+",推送内容:"+message);result=true;}} catch (IOException e) {log.error("发生错误",e);continue;}}return result;}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocketServer.onlineCount++;}public static synchronized void subOnlineCount() {if(WebSocketServer.onlineCount>0){WebSocketServer.onlineCount--;}}@Overridepublic void setEnvironment(final Environment environment) {this.environment = environment;if (globalEnvironment == null && environment != null) {globalEnvironment = environment;}}
}