最近正好項(xiàng)目升級(jí),用到websocket,改寫原來那些繁瑣代碼!!
1. 原生注解
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocketConfig
*/packagecn.coder4j.study.example.websocket.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.socket.config.annotation.EnableWebSocket;
importorg.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
@EnableWebSocket
public? class? WebSocketConfig{
@Bean
public ServerEndpointExporter serverEndpoint(){
returnnewServerEndpointExporter();
}
}
說明:
這個(gè)配置類很簡單,通過這個(gè)配置 spring boot 才能去掃描后面的關(guān)于 websocket 的注解
WsServerEndpoint
packagecn.coder4j.study.example.websocket.ws;
importorg.springframework.stereotype.Component;
importjavax.websocket.OnClose;
importjavax.websocket.OnMessage;
importjavax.websocket.OnOpen;
importjavax.websocket.Session;
importjavax.websocket.server.ServerEndpoint;
importjava.io.IOException;
importjava.util.HashMap;importjava.util.Map;
@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint{
/**
? ? * 連接成功
? ? *
? ? * @param session
? ? */@OnOpenpublicvoidonOpen(Session session){System.out.println("連接成功");}/**
? ? * 連接關(guān)閉
? ? *
? ? * @param session
? ? */@OnClosepublicvoidonClose(Session session){System.out.println("連接關(guān)閉");}/**
? ? * 接收到消息
? ? *
? ? * @param text
? ? */
@OnMessage
public String onMsg(String text)throws IOException{
return"servet 發(fā)送:"+text;
}
}
說明
這里有幾個(gè)注解需要注意一下,首先是他們的包都在 **javax.websocket **下。并不是 spring 提供的,而 jdk 自帶的,下面是他們的具體作用。
@ServerEndpoint
通過這個(gè) spring boot 就可以知道你暴露出去的 ws 應(yīng)用的路徑,有點(diǎn)類似我們經(jīng)常用的@RequestMapping。比如你的啟動(dòng)端口是 8080,而這個(gè)注解的值是 ws,那我們就可以通過 ws://127.0.0.1:8080/ws 來連接你的應(yīng)用
@OnOpen
當(dāng) websocket 建立連接成功后會(huì)觸發(fā)這個(gè)注解修飾的方法,注意它有一個(gè)? Session 參數(shù)
@OnClose
當(dāng) websocket 建立的連接斷開后會(huì)觸發(fā)這個(gè)注解修飾的方法,注意它有一個(gè)? Session 參數(shù)
@OnMessage
當(dāng)客戶端發(fā)送消息到服務(wù)端時(shí),會(huì)觸發(fā)這個(gè)注解修改的方法,它有一個(gè) String 入?yún)⒈砻骺蛻舳藗魅氲闹?/p>
@OnError
當(dāng) websocket 建立連接時(shí)出現(xiàn)異常會(huì)觸發(fā)這個(gè)注解修飾的方法,注意它有一個(gè)? Session 參數(shù)
另外一點(diǎn)就是服務(wù)端如何發(fā)送消息給客戶端,服務(wù)端發(fā)送消息必須通過上面說的 Session 類,通常是在@OnOpen 方法中,當(dāng)連接成功后把 session 存入 Map 的 value,key 是與 session 對(duì)應(yīng)的用戶標(biāo)識(shí),當(dāng)要發(fā)送的時(shí)候通過 key 獲得 session 再發(fā)送,這里可以通過session.getBasicRemote().sendText(*)* 來對(duì)客戶端發(fā)送消息。