1

我尝试在客户端使用 Angular2/typescript 网站,在服务器端使用 Mac OSX 上的 Swift 中的 Kitura 服务器来创建客户端-服务器应用程序。在客户端,打字稿代码实例化了一个 EventSource 对象:

    this.eventSource = new EventSource(this.webSocketServerUrl);
    this.eventSource.onopen = (event: Event): any => {
        console.log("ServerNotificationsService.onopen - " + JSON.stringify(event) + " " + this.eventSource.readyState);
        event.stopPropagation();
        return null;
    }
    this.eventSource.onerror = (event: sse.IOnMessageEvent) => {
        console.log("ServerNotificationsService.onerror - " + JSON.stringify(event) + " " + this.eventSource.readyState);
    }
    this.eventSource.onmessage = (event: Event): any => {
        console.log("ServerNotificationsService.onmessage - " + JSON.stringify(event) + " " + this.eventSource.readyState);
        event.stopPropagation();
        return null;
    }
    console.log("ServerNotificationsService.constructor - " + this.eventSource.readyState);

在服务器端,我处理 GET 请求的代码如下所示:

router.get("/notifications") { request, response, next in 
response.headers.append("Access-Control-Allow-Origin", value: "*")

if((request.accepts(header: "Accept", type: "text/event-stream")) != nil)
{
  response.headers.append("content-type", value: "text/event-stream; charset=utf-8")
  response.headers.append("cache-control", value: "no-cache")
  response.headers.append("connection", value: "keep-alive")
  try response.end()
  Logger.sharedInstance.verbose(msg: "Request GET /notifications OK")
}
else
{
  try response.status(.internalServerError).end()
  Logger.sharedInstance.verbose(msg: "Request GET /notifications internalServerError")
}

next()
}

并处理发布请求:

router.post("/notifications") { request, response, next in
Logger.sharedInstance.verbose(msg: "Request POST /notifications ...")
response.headers.append("Access-Control-Allow-Origin", value: "*")
response.headers.append("content-type", value: "text/event-stream; charset=utf-8")
response.headers.append("cache-control", value: "no-cache")
response.headers.append("connection", value: "keep-alive")

while (true)
{
  // wait here 5s. for the <nextMessage>
  response.send(<nextMessage>)
  try response.end()
  Logger.sharedInstance.verbose(msg: "Request POST /notifications OK")
  next()
}
}

问题是在客户端我收到 onopen 通知,事件源的 readyState 传递给“Open”(1),但我在 onerror 通知和 readyState 传递给“Connecting”(0)之后立即收到。依此类推:连接,关闭,连接,关闭,......因此,发布请求永远不会执行。

我将感谢一些帮助,以拥有一个保持开放连接的代码。

谢谢,

诺图克斯

4

1 回答 1

1

Kitura 目前不支持持久的、开放的 HTTP 连接。但是,您可能能够使用 WebSocket 而不是服务器通过 HTTP 发送的事件来复制功能(您需要重写前端代码以使用 WebSockets 而不是 EventSource): https ://github.com/IBM-Swift/Kitura -WebSocket

可以在此处找到示例 Kitura-WebSocket 应用程序: https ://github.com/IBM-Swift/Kitura-Chat-Server

于 2017-01-09T17:17:01.400 回答