webSocket
WebSocket是一種網絡傳輸協議,可在單個TCP連接上進行全雙工通信,位於OSI模型的應用層。WebSocket協議在2011年由IETF標準化爲RFC 6455,後由RFC 7936補充規範。Web IDL中的WebSocket API由W3C標準化。
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就可以創建持久性的連接,並進行雙向數據傳輸。
簡單廣播模式實現
使用java 實現客戶端和服務端兩部分
springboot websocket java
實現java的服務端
- 加入相關依賴
# 加入websocket 的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 配置文件實現 WebSocketConfigure.java
- 實現 WebSocketMessageBrokerConfigurer 接口,註冊一個 STOMP 節點,配置一個廣播消息代理
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfigure implements WebSocketMessageBrokerConfigurer {
//這個方法的作用是添加一個服務端點,來接收客戶端的連接。
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
//表示添加了一個/demo,客戶端就可以通過這個端點來進行連接。
stompEndpointRegistry.addEndpoint("/demo");
}
//這個方法的作用是定義消息代理,通俗一點講就是設置消息連接請求的各種規範信息
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//表示客戶端訂閱地址的前綴信息,也就是客戶端接收服務端消息的地址的前綴信息
registry.enableSimpleBroker("/topic");
//指服務端接收地址的前綴,意思就是說客戶端給服務端發消息的地址的前綴
registry.setApplicationDestinationPrefixes("/app");
}
//使用MessageMapping
//Spring對於WebSocket封裝的特別簡單,提供了一個@MessageMapping註解,功能類似@RequestMapping
//SimpMessagingTemplate
//SimpMessagingTemplate是Spring-WebSocket內置的一個消息發送工具,可以將消息發送到指定的客戶端。
}
- 控制代碼示例
- DemoRequest和DemoResponse 是通信的簡單封裝類,這裏不具體實現了。
@Controller
@RequiredArgsConstructor
public class DemoController {
private final SimpMessagingTemplate simpMessagingTemplate;
//用來實現WebSocket客戶端發送公告功能
@RequestMapping("/hello")
public String hello() {
return "/hello/demo";
}
//這個方法是接收客戶端發送功公告的WebSocket請求
@MessageMapping("/demo")
public void demo(DemoRequest req) {
System.out.println("recv:"+req);
//使用這個方法進行消息的轉發發送
simpMessagingTemplate.convertAndSend("/topic/demo", new DemoResponse("Im server"));
}
//等同demo
//@SendTo定義了消息的目的地。結合例子解釋就是“接收/app/demo01的value,將value轉發到/topic/demo01客戶端
///topic/demo01是客戶端發起連接後,訂閱服務端消息時指定的一個地址,用於接收服務端的返回,後面我們在寫客戶端代碼的時候會看見。
@MessageMapping("/demo01")
@SendTo("/topic/demo01")
public DemoResponse demo01 (DemoRequest request) {
return new DemoResponse("123");
}
}
到這裏webSocket的服務端已經完成了。
實現java的客戶端
- 加入相關依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.5</version>
</dependency>
- 實現連接測試代碼
public class TestClient {
public static void main(String ... args) {
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
stompClient.setTaskScheduler(new ConcurrentTaskScheduler());
String url = "ws://127.0.0.1:8080/demo";
StompSessionHandler sessionHandler = new DemoSessionHandler();
stompClient.connect(url, sessionHandler);
new Scanner(System.in).nextLine();//爲了等待通信完成
}
}
- 連接通信
public class DemoSessionHandler extends StompSessionHandlerAdapter {
@Override
public Type getPayloadType(StompHeaders headers) {
return DemoResponse.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
System.out.println("get message from server:"+ ((DemoResponse)payload).getContent() );
}
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
System.out.println("connected");
session.subscribe("/topic/demo01",this);
session.send("/app/demo01",new DemoRequest("demo"));
System.out.println("send to server :");
System.out.println(session.getSessionId());
// session.send("/app/demo01",new DemoRequest("123"));
// System.out.println("send to server :");
}
@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload,
Throwable exception) {
exception.printStackTrace();
}
}
問題回顧:
解決:相關stompEndpointRegistry.addEndpoint("/demo").withSockJS(); 去掉.withSockJS()
瞭解更多:
相關websocket https://en.wikipedia.org/wiki/WebSocket | https://zh.wikipedia.org/wiki/WebSocket