最便捷使用netty-websocket方法
1.pom添加依賴
<dependency> <groupId>org.yeauty</groupId> <artifactId>netty-websocket-spring-boot-starter</artifactId> <version>0.8.0</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.41.Final</version> </dependency>
2.工具類
package com.xck.service; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.timeout.IdleStateEvent; import org.springframework.context.annotation.Scope; import org.springframework.web.bind.annotation.RestController; import org.yeauty.annotation.*; import org.yeauty.pojo.ParameterMap; import org.yeauty.pojo.Session; import java.io.*; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArraySet; @ServerEndpoint(prefix = "netty-websocket" ) //在yml文件配置參數 @RestController @Scope("prototype") public class NettyWebSocketUtil { /*// 注入的時候,給類的 service 注入 private static GpsService gpsService; @Autowired public void setChatService(GpsService gpsService) { NettyWebSocketController.gpsService= gpsService; } */ // concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象 private static CopyOnWriteArraySet<Session> webSocketSet = new CopyOnWriteArraySet<Session>(); /** * 請求連接 * @param session 請求連接的標識 * @param headers * @param parameterMap 請求參數(nettyWS只能通過get方式傳參數 URL?param="1"¶m2="1") * @throws IOException */ @OnOpen public void onOpen(Session session, HttpHeaders headers,ParameterMap parameterMap) throws IOException { webSocketSet.add(session); String Parame=parameterMap.getParameter("Parame"); String Parame2=parameterMap.getParameter("Parame2"); } /** * 請求關閉 * @param session 請求連接的標識 * @throws IOException */ @OnClose public void onClose(Session session) throws IOException { // System.out.println("one connection closed"); webSocketSet.remove(session); session.flush(); session.close(); } /** * 請求出錯 * @param session 請求連接的標識 * @throws IOException */ @OnError public void onError(Session session, Throwable throwable) { webSocketSet.remove(session); throwable.printStackTrace(); } /** * 接收數據 * @param session 請求連接的標識 * @param message 接收的消息 * @throws IOException */ @OnMessage public void OnMessage(Session session, String message) { } /** * 發送消息(二進制) * @param session * @param bytes */ @OnBinary public void OnBinary(Session session, byte[] bytes) { for (byte b : bytes) { System.out.println(b); } session.sendBinary(bytes); } /** * 群發 * @param obj 發送的消息 */ public static synchronized void sendMessage2(Object obj) { //獲取session if (webSocketSet!=null) { Iterator<Session> it = webSocketSet.iterator(); while (it.hasNext()) { Session session = it.next(); if (session != null && session.isOpen()) { session.sendText(obj.toString()); }else if(session != null && !session.isOpen()){ it.remove(); } } } } @OnEvent public void onEvent(Session session, Object evt) { if (evt instanceof IdleStateEvent) { IdleStateEvent idleStateEvent = (IdleStateEvent) evt; switch (idleStateEvent.state()) { case READER_IDLE: System.out.println("read idle"); break; case WRITER_IDLE: System.out.println("write idle"); break; case ALL_IDLE: System.out.println("all idle"); break; default: break; } } } }
3.配置文件(yml 文件)
netty-websocket: #對應@ServerEndpoint(prefix = "netty-websocket" ) host: 0.0.0.0 path: /gps/WebSocket #訪問路徑 port: 8099 #端口
4.注冊 (本地測試需要加入,打包發布注釋掉)
@Configuration public class WebConfig implements WebMvcConfigurer { private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class); /** * 功能描述(打war包時需要注釋掉,打成war或者傳統方式發布到tomcat中, 相當於啟動了兩次 ) * @author why * @date 2019/6/10 * @param * @return org.springframework.web.socket.server.standard.ServerEndpointExporter * @description 配置ServerEndpointExporter,配置后會自動注冊所有“@ServerEndpoint”注解聲明的Websocket Endpoint */ /* @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } */ }