服务器使用 Kitura 发送事件
Server Sent Events with Kitura
我尝试做一个客户端-服务器应用程序,客户端是 Angular2/typescript 网站,服务器端是 Swift on Mac [=31] 的 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()
}
并处理 post 请求:
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)。依此类推:连接,关闭,连接,关闭,...因此 post 请求永远不会执行。
如果能提供维护开放连接的代码,我将不胜感激。
谢谢,
Notux
Kitura 当前不支持持久的、开放的 HTTP 连接。但是,您可以使用 WebSocket 而不是通过 HTTP 服务器发送的事件来复制功能(您需要重写前端代码以使用 WebSocket 而不是 EventSource):
https://github.com/IBM-Swift/Kitura-WebSocket
可以在此处找到示例 Kitura-WebSocket 应用程序:
https://github.com/IBM-Swift/Kitura-Chat-Server
我尝试做一个客户端-服务器应用程序,客户端是 Angular2/typescript 网站,服务器端是 Swift on Mac [=31] 的 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()
}
并处理 post 请求:
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)。依此类推:连接,关闭,连接,关闭,...因此 post 请求永远不会执行。
如果能提供维护开放连接的代码,我将不胜感激。
谢谢,
Notux
Kitura 当前不支持持久的、开放的 HTTP 连接。但是,您可以使用 WebSocket 而不是通过 HTTP 服务器发送的事件来复制功能(您需要重写前端代码以使用 WebSocket 而不是 EventSource): https://github.com/IBM-Swift/Kitura-WebSocket
可以在此处找到示例 Kitura-WebSocket 应用程序: https://github.com/IBM-Swift/Kitura-Chat-Server