При выполнении websocket с паром 3.0.8, соединение сразу становится тайм-аут

В настоящее время мы создаем серверное приложение (Deploy to VaporCloud), которое связывает JavaScript и WebSocket браузера с Vapor 3.0.8 и Swift4.1. В этом случае, хотя мы можем подключить websocket, даже если мы не оставляем сообщение как есть, 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
  .....
}

1 ответ

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

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

ТВН. Я не пробовал это лично, но это должно сработать.

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

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

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)
}
Другие вопросы по тегам