实现客户端的目的,是我为了把websocket服务端与业务层分离开单独做个服务。我还专门把客户端配置到common模块中。只要引用到了common模块的服务。默认都实现了客户端。but,需要做下配置才能实现客户端
org.springframework.boot spring-boot-starter-websocket
@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单独做服务的主要目的是实现解耦,复用。让微服务划分更明确!