(轉)WebSocket學習
阿新 • • 發佈:2018-11-07
石墨文件:https://shimo.im/docs/3UkyOPJvmj4f9EAP/
(二期)17、即時通訊技術websocket
ws://example.com:80/some/path
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Upgrade: websocket
Connection: Upgrade
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
註解、成員資料介紹
@ServerEndpoint
宣告websocket地址
4.Session
5.Session.getBasicRemote().sendText("message")
websocket demo git:
- 開啟socktJS:
- 使用STOMP:
- 使用spring websocket:
第一步
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--新增jsp支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
第二步
@Configuration
@EnableWebSocketMessageBroker//註解表示開啟使用STOMP協議來傳輸基於代理的訊息,Broker就是代理的意思。
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
/***
* 註冊 Stomp的端點
* addEndpoint:新增STOMP協議的端點。提供WebSocket或SockJS客戶端訪問的地址
* withSockJS:使用SockJS協議
* @param registry
*/
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/endpointWisely")
.withSockJS() ;
registry.addEndpoint("/websocket")
.setAllowedOrigins("*")//新增允許跨域訪問
.withSockJS() ;
}
/**
* 配置訊息代理
* 啟動Broker,訊息的傳送的地址符合配置的字首來的訊息才傳送到這個broker
*/
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/api/v1/socket/send","/user/", "/topic");//推送訊息字首
registry.setApplicationDestinationPrefixes("/api/v1/socket/req");//應用請求字首
registry.setUserDestinationPrefix("/user");//推送使用者字首
}
}
第三步
@MessageMapping("/welcomeTopic")//瀏覽器傳送請求通過@messageMapping 對映/welcome 這個地址。
@SendTo("/topic/getResponse")//伺服器端有訊息時,會訂閱@SendTo 中的路徑的瀏覽器傳送訊息。
public ResponseMessage say(RequestMessage message) throws Exception {
System.out.println("傳送資訊-----------------------" + message.getMessage());
return new ResponseMessage("Welcome, " + message.getMessage() + "!");
}
@MessageMapping("/queue/chat/{uid}")
public void chat(@Payload @Validated Message message, @DestinationVariable("uid") String uid, Principal principal) {
String msg = "傳送人: " + principal.getName() + " chat ";
simpMessagingTemplate.convertAndSendToUser(uid,"/queue/chat",msg);
}
1-n topic:
1-1 queue:
stompClient.subscribe('/user/queue/chat',function(greeting){
showGreeting(greeting.body);
});
@MessageMapping("/queue/chat/{uid}")
public void chat(@Payload @Validated Message message, @DestinationVariable("uid") String uid, Principal principal) {
String msg = "傳送人: " + principal.getName() + " chat ";
simpMessagingTemplate.convertAndSendToUser(uid,"/queue/chat",msg);
}
function chat(uid) {
stompClient.send("/app/queue/chat/"+uid,{},JSON.stringify({'title':'hello','content':'message content'}));
}
https://gitee.com/java-mindmap/training-camp-project-demo/tree/master/springboot-websocket