实现客户端的目的,是我为了把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单独做服务的主要目的是实现解耦,复用。让微服务划分更明确!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐