springboot websocket 客户端实现
把websocket单独做服务的主要目的是实现解耦,复用。
·
实现客户端的目的,是我为了把websocket服务端与业务层分离开单独做个服务。我还专门把客户端配置到common模块中。只要引用到了common模块的服务。默认都实现了客户端。but,需要做下配置才能实现客户端
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
@Component @ClientEndpoint public class WebSocketClient { @Value("${websocket.server.url:127.0.0.1:8692/ws}") private String serverUrl; @Value("${websocket.server.user:system@1}") private String user; private Session session; @PostConstruct void init() { try { // 本机地址 WebSocketContainer container = ContainerProvider.getWebSocketContainer(); String wsUrl = "ws://" + serverUrl + "/" + user; URI uri = URI.create(wsUrl); session = container.connectToServer(WebSocketClient.class, uri); } catch (DeploymentException | IOException e) { e.printStackTrace(); } } /** * 打开连接 * @param session */ @OnOpen public void onOpen(Session session) { System.out.println("打开"); this.session = session; } /** * 接收消息 * @param text */ @OnMessage public void onMessage(String text) { System.out.println(text); } /** * 异常处理 * @param throwable */ @OnError public void onError(Throwable throwable) { throwable.printStackTrace(); } /** * 关闭连接 */ @OnClose public void onClosing() throws IOException { System.out.println("关闭"); session.close(); } /** * 主动发送消息 */ public void send(String message) { this.session.getAsyncRemote().sendText(message); } public void close() throws IOException{ if(this.session.isOpen()){ this.session.close(); } } }
以上代码是实现客户端的关键。websocket.server.user配置。是我为了区分微服务中从哪个服务发出的。换句话说。比如我有库存服务。订单服务。那么websocket.server.user在application.yml中可以这样配置。websocket.server.user=storage@1。websocket.server.user=order@1。然后再服务端进行解析就知道。这个消息是从哪个服务发起的。
这样把websocket单独做服务的主要目的是实现解耦,复用。让微服务划分更明确!
更多推荐
已为社区贡献1条内容
所有评论(0)