java转发代理websocket服务
目录
- 需求背景
- 代码实现
一、需求背景
有一个较复杂websocket接口,需要java应用层包装一下,提供给客户端使用。所以有三个角色: 客户端 应用层服务 服务端。应用层在中间做了简单的逻辑调整,整体正来说还是起到一个代理转发的作用。
二、代码实现
1 pom依赖springboot-websocket
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2 应用层serverEndpoint配置
@Configuration
public class ServerWebSocketConfig {
//这个会扫描@ServerEndpoint标注的类
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
//最大字符限制
container.setMaxTextMessageBufferSize(1024);
//session超时时间
container.setMaxSessionIdleTimeout(60);
return container;
}
}
3 消息处理代码
//客户端和应用层交互代码
@Slf4j
@Component
@ServerEndpoint(value = "/v10/tts/synth/{property}/continue")
public class ServerMessageEndpoint {
//spring中的bean注入在websocket中比较特殊,不能按照普通方式处理,因为每个ws连接进来都会创建一个ServerMessageEndpoint,
//是单例模式所以不能普通注入
public static WsServerConfig wsServerConfig;
//服务端ws对象
private TTSWsClientEndpoint ttsWsClientEndpoint;
@Autowired
public void setWsServerConfig(WsServerConfig wsServerConfig) {
ServerMessageEndpoint.wsServerConfig = wsServerConfig;
}
@OnOpen
public void onOpen(Session session) throws IOException {
this.ttsWsClientEndpoint = new TTSWsClientEndpoint(url);
}
@OnMessage
public void onMessage(String message, Session session) {}
@OnClose
public void onClose(Session session, CloseReason closeReason) {}
@OnError
public void onError(Session session, Throwable error) throws IOException {}
}
//应用层和服务端ws交互代码
@Slf4j
@ClientEndpoint
public class TTSWsClientEndpoint {
//构造方法,使用TTSWsClientEndpoint 的时候需要new一个
public TTSWsClientEndpoint(String url) {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
try {
container.connectToServer(this, new URI(url));
} catch (URISyntaxException | DeploymentException | IOException e) {
throw new ServiceException("99999", e);
}
}
@OnOpen
public void onOpen(Session session) throws IOException {
//发送ping心跳维持和服务端的session,保证不连接超时被关闭
session.getAsyncRemote().sendPing(ByteBuffer.wrap(new byte[0]));
}
@OnMessage
public void onMessage(String message, Session session) {}
@OnClose
public void onClose(Session session, CloseReason closeReason) {}
@OnError
public void onError(Session session, Throwable error) throws IOException {}
@OnMessage(maxMessageSize = 1024 * 1024)
public void onMessage(ByteBuffer buffer, Session session) {}
@OnMessage
public void onPong(PongMessage pong, Session session) {
try {
////发送ping心跳维持和服务端的session,保证不连接超时被关闭
session.getAsyncRemote().sendPing(ByteBuffer.wrap(new byte[0]));
} catch (IOException e) {
log.error("uuid:{} tts 心跳ping异常", uuid, e);
}
}
}
touch fish