使用蒸气3.0.8进行websocket时,连接立即变为超时

时间:2018-08-22 23:45:44

标签: swift websocket vapor

当前,我们正在创建一个服务器应用程序(部署到VaporCloud),用于通过Vapor 3.0.8和Swift4.1与浏览器的JavaScript和WebSocket通信。 在那种情况下,尽管我们可以连接websocket,但是即使我们不按原样保留消息,onClose也会在大约30秒内出现在JavaScript端,并且连接将会丢失。 我们如何保持连接?

[服务器端源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
  .....
}

2 个答案:

答案 0 :(得分:1)

Vapor Cloud负载平衡器有一个超时位置,它将自动关闭连接。

从理论上讲,您应该能够偶尔从后端或客户端发送ping数据包,从而使连接保持打开状态。

Tbh。我没有亲自尝试过,但应该可以。

(这里有一个例子,是随机找到的,所以我没有尝试过:) http://www.jstips.co/en/javascript/working-with-websocket-timeout/

答案 1 :(得分:0)

要使连接保持活动状态,您可以安排固定的延迟重复执行任务:

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)
}