java转发代理websocket服务

目录

  1. 需求背景
  2. 代码实现

一、需求背景

有一个较复杂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);
	    }
  }
}
posted @ 2024-04-30 10:54  meow_world  阅读(571)  评论(0)    收藏  举报