При выполнении веб-сокета с помощью steam 3.0.8 соединение сразу становится тайм-аутом

В настоящее время мы создаем серверное приложение (развертывание в VaporCloud), которое связывает JavaScript браузера и WebSocket с Vapor 3.0.8 и Swift4.1. В этом случае, хотя мы можем подключить веб-сокет, даже если мы не оставим сообщение как есть, onClose произойдет на стороне JavaScript примерно через 30 секунд, и соединение будет потеряно. Как мы можем поддерживать связь?

[Источники на стороне сервера Sources/App/configure.swift)]

    public func configure(_ config: inout Config, _ env: inout Environment, _ 
services: inout Services) throws {
        let wss = NIOWebSocketServer.default() 
        wss.get(at:["chat"], use:{ ws,req in
          ws.onText({ (ws, text) in
          .....    
          ws.send("test")
          .....
        })
        .....
        })   
        services.register(wss, as: WebSocketServer.self)
        .....

[Сторонний источник JavaScript]

ws = new WebSocket('wss://hostname');
ws.onopen = function() {
    .....
    ws.send("test connect");
};
$('form').on('submit', function(e) {
  e.preventDefault();
  ws.send("test");
});
ws.onmessage = function(event) {
  console.log("data=" + event.data);
  .....
}
ws.onclose = function (e) {
  console.log("Close Code = " + e.code); // return 1006
  console.log("Close Reason = " + e.reason); // null
  .....
}

person sakahiro0911    schedule 22.08.2018    source источник


Ответы (2)


Балансировщики нагрузки Vapor Cloud имеют тайм-аут, который автоматически закроет соединение.

Теоретически вы должны иметь возможность время от времени отправлять ping-пакет либо от серверной части, либо от клиента, что будет держать соединение открытым.

тбх. Я не пробовал это лично, но это должно работать.

(Здесь есть пример, случайно найденный, поэтому я не пробовал :) http://www.jstips.co/en/javascript/working-with-websocket-timeout/ )

person joscdk    schedule 23.08.2018
comment
Спасибо!! Я попробовал этот пример, но даже если я регулярно отправляю, соединение будет отключено также через 30 секунд. При обработке метода ws.onText серверное приложение сохраняет ws в массиве и отправляет сообщение, отправленное из другого сеанса, клиенту ws. Можно ли подумать, что ws свободно освободится из памяти на серверном приложении? - person sakahiro0911; 24.08.2018
comment
Привет! Чтобы решить эту проблему, я в настоящее время просто переподключаюсь сразу после сброса, и все выглядит нормально (WebSocket, кажется, может сразу же снова подключиться). Однако, если вы найдете лучшее решение, пожалуйста, поделитесь! - person Sinbu; 22.12.2018

Чтобы поддерживать соединение, вы можете запланировать повторяющуюся задачу с фиксированной задержкой:

socket.eventLoop.scheduleRepeatedTask(initialDelay: .seconds(5), delay: .seconds(10)) { task -> Void in
    guard !socket.isClosed else {
        task.cancel()
        return
    }
    socket.send(raw: UUID().uuidString, opcode: .ping)
}
person Sameer Jagtap    schedule 20.07.2020