> For the complete documentation index, see [llms.txt](https://brianwu.gitbook.io/brian/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brianwu.gitbook.io/brian/java/spring/websocket.md).

# WebSocket

## Build

參考資料:(<https://ithelp.ithome.com.tw/articles/10197142>)

```
implementation 'org.springframework.boot:spring-boot-starter-websocket'
```

4\. 必須要有一個 WebSocketConfig 類

**注意，如果依賴裡面有 spring-boot-starter-web 那會找不到 AbstractWebSocketMessageBrokerConfigurer**

```

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
	  @Override
	    public void configureMessageBroker(MessageBrokerRegistry config) {
	        config.enableSimpleBroker("/topic");

	    }

	    @Override
	    public void registerStompEndpoints(StompEndpointRegistry registry) {
	        registry.addEndpoint("/endpointChatRoom").withSockJS();
	    }
}
```

`@EnableWebSocketMessageBroker`  這個註解是宣告啟用`STOMP`協定,他是WebSocket的子協定來傳輸(message broker)消息,當註冊了之後控制器(`Controller`)就能使用\
`configureMessageBroker` 這個方法是用來配置訊息代理(MessageBroker)\
`registerStompEndpoints` 這個方法讓我們註冊了一個節點，用來映射指定 URL，方法內註冊一個 STOMP 的 endpoint，並指定使用 SockJS 協定。

5\. 我們還要建立一個 Controller 來當我們的入口<br>

```
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

import com.tutorial.Model.ChatClientModel;
import com.tutorial.Model.ServerResponseModel;

@Controller
public class CharRoomController {
	@MessageMapping("/messageControl")
	@SendTo("topic/getResponse")
	public ServerResponseModel said(ChatClientModel responseMessage) throws InterruptedException{
		Thread.sleep(3000);
		return new ServerResponseModel("歡迎來到," + responseMessage.getClientname());
	}
}
```

&#x20;`@MessageMapping`類似於 `@RequestMapping`

## 重點與心得

1.此篇先介紹server端如何建構,下一篇建構client端並且做demo測試\
2.我們需要建構兩個數據模型,一個是接收client訊息一個是發送給client訊息\
3.這是一個廣播是的發送範例,如果你要的是一個獨立的私密聊天室你可以參考Spring Security將它整合在一起就可以達到你要的目的\
4.下一篇會介紹Client如何完成我們的聊天室\
5.這邊在強調一次這個範例不能加上`spring-boot-starter-web`\
6.Spring Boot執行時會掃描group內的`@Configuration`如果有`@Enable...`將會啟用該配置

## 參考資源

* 更多WebSocket觀念可以參考以下資源再做學習\
  (<http://blog.csdn.net/wwd0501/article/details/54582912> ) 作者:王卫东\
  (<http://www.baeldung.com/websockets-spring> ) 作者: baeldung\
  (<https://spring.io/guides/gs/messaging-stomp-websocket/> ) 作者:Spring官方教學
