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



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

[服务器端源/应用/配置.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
.....
}

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

最新更新