Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用vapor 3.0.8执行websocket时,连接立即变为超时_Swift_Websocket_Vapor - Fatal编程技术网

Swift 使用vapor 3.0.8执行websocket时,连接立即变为超时

Swift 使用vapor 3.0.8执行websocket时,连接立即变为超时,swift,websocket,vapor,Swift,Websocket,Vapor,目前,我们正在创建一个服务器应用程序(部署到VaporCloud),它将浏览器的JavaScript和WebSocket与Vapor 3.0.8和Swift4.1进行通信。 在这种情况下,尽管我们可以连接websocket,但即使我们没有保持消息的原样,onClose将在大约30秒后在JavaScript端发生,并且连接将丢失。 我们如何保持联系 [服务器端源代码/App/configure.swift] [Javascript端源代码] ws = new WebSocket('wss://ho

目前,我们正在创建一个服务器应用程序(部署到VaporCloud),它将浏览器的JavaScript和WebSocket与Vapor 3.0.8和Swift4.1进行通信。 在这种情况下,尽管我们可以连接websocket,但即使我们没有保持消息的原样,onClose将在大约30秒后在JavaScript端发生,并且连接将丢失。 我们如何保持联系

[服务器端源代码/App/configure.swift]

[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
  .....
}

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

理论上,您应该能够从后端或客户端偶尔发送ping数据包,这将保持连接打开

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


(这里有一个例子,是随机找到的,所以我没有尝试过:)

为了保持连接的有效性,您可以安排固定延迟的重复任务:

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

谢谢我尝试过这个例子,但即使我定期发送,30秒后连接也会断开。在ws.onText方法的处理过程中,服务器应用程序将ws存储在一个数组中,并将另一个会话发送的消息发送到ws的客户端。有可能认为ws将从服务器应用程序的内存中自由释放吗?嗨!为了解决这个问题,我目前只需在删除后立即重新连接,这似乎很好(WebSocket似乎可以立即再次连接)。但是,如果您找到了更好的解决方案,请与我们分享!
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)
}