弹簧websocket超时设置



我使用的是Spring websocket支持。我的问题是如何设置websocket连接超时。现在,连接会在几分钟后自动关闭。我希望永远不要关闭连接。

这是我的websocket处理程序:

public class MyHandler implements WebSocketHandler {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    class MyTimerTask extends TimerTask {
        private WebSocketSession session;
        public MyTimerTask(WebSocketSession session) {
            this.session = session;
        }
        @Override
        public void run() {
            try {
                String msg = ((int)(Math.random()*50)) + "";
                this.session.sendMessage(new TextMessage(msg.toString()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Autowired
    private UserDao userDao;
    @Autowired
    private JdbcDaoImpl jdbcDaoImpl;
    private Timer timer;
    @Override
    public void afterConnectionEstablished(WebSocketSession session)
            throws Exception {
        System.out.println("websocket????");
        timer = new Timer();
        timer.schedule(new MyTimerTask(session), 0, 1000);
        logger.info("logger connection");
    }
    @Override
    public void handleMessage(WebSocketSession session,
            WebSocketMessage<?> message) throws Exception { }
    @Override
    public void handleTransportError(WebSocketSession session,
            Throwable exception) throws Exception { }
    @Override
    public void afterConnectionClosed(WebSocketSession session,
            CloseStatus closeStatus) throws Exception {
        System.out.println("websocket????");
        timer.cancel();
    }
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }   
}

我的websocket配置:

<websocket:handlers>
    <websocket:mapping path="/myHandler" handler="myHandler"/>
</websocket:handlers>
<bean id="myHandler" class="com.sdp.websocket.MyHandler"/>

和javascript客户端:

var webserver = 'ws://localhost:8080/authtest/myHandler';
var websocket = new WebSocket(webserver);
websocket.onopen = function (evt) { onOpen(evt) }; 
websocket.onclose = function (evt) { onClose(evt) }; 
websocket.onmessage = function (evt) { onMessage(evt) }; 
websocket.onerror = function (evt) { onError(evt) }; 
function onOpen(evt) { 
    console.log("Connected to WebSocket server."); 
} 
function onClose(evt) { 
    console.log("Disconnected"); 
} 
function onMessage(evt) { 
    console.log('Retrieved data from server: ' + evt.data); 
} 
function onError(evt) { 
    console.log('Error occured: ' + evt.data); 
}
debugger;
function sendMsg(){
    websocket.send("{msg:'hello'}");
}

在服务器或客户端决定关闭网络套接字之前,网络套接字一直处于打开状态。但是,网络套接字会受到两个超时的影响:

  • HTTP会话超时
  • 代理连接超时

如果你的客户端和服务器之间只有一个websocket连接,并且你没有通过HTTP与AJAX或请求其他页面进行交互,那么HTTP会话将过期,一些服务器决定将其与websocket一起失效(Tomcat7有一个错误,就是这样做的)。其他一些服务器不这么做,因为他们看到websocket上有活动。请参阅此处以获得扩展讨论:需要一些关于HttpSession上次访问时间如何以及何时更新的解决方案或说明。

另一个超时是代理。他们看到了连接,如果电线在很长一段时间内没有活动,他们就会切断它,因为他们认为它挂断了。为了解决这个问题,虽然你没有发送实际的应用程序数据,但你需要不时地发送心跳或消息,让代理知道连接仍然正常

其他问题也可能会介入,比如浏览器对websocket的错误支持、网络配置方式、防火墙规则等。

有关Spring中可用的超时选项,请参阅websocket文档:配置websocket引擎。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        var container = new ServletServerContainerFactoryBean();
        container.setMaxSessionIdleTimeout(...);
        return container;
    }
}

最新更新