События, отправленные сервером с Китурой

Я пытаюсь создать клиент-серверное приложение с веб-сайтом Angular2 / typescript на стороне клиента, а на стороне сервера - сервером Kitura в Swift на Mac OSX. На стороне клиента машинописный код создает экземпляр объекта 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), но я получаю сразу после уведомления об ошибке, а readyState переходит к «Connecting» (0). И так далее: подключение, закрытие, подключение, закрытие ... И, как следствие, почтовый запрос никогда не выполняется.

Я буду признателен за помощь, если у вас будет код, поддерживающий открытую связь.

Спасибо,

Notux


person Notux    schedule 09.01.2017    source источник


Ответы (1)


Kitura в настоящее время не поддерживает постоянные открытые HTTP-соединения. Однако вы можете реплицировать функциональность с помощью WebSocket вместо событий, отправляемых сервером через HTTP (вам нужно будет переписать код внешнего интерфейса, чтобы использовать WebSockets вместо EventSource): https://github.com/IBM-Swift/Kitura-WebSocket

И пример приложения Kitura-WebSocket можно найти здесь: https://github.com/IBM-Swift/Kitura-Chat-Server

person Youming Lin    schedule 09.01.2017
comment
Спасибо за ваш ответ. Прежде чем попробовать SSE, я поискал библиотеку веб-сокетов Swift и не нашел ничего ценного, но я пропустил Kitura-WebSocket. Я изменил свою программу, чтобы использовать ее, но теперь у меня есть исключение, когда клиент пытается подключиться к серверу. Я исследую ... - person Notux; 12.01.2017
comment
@Notux Мы только что публично выпустили Kitura-WebSocket несколько дней назад, поэтому вполне понятно, что вы могли пропустить его во время поиска. Не стесняйтесь открывать любые проблемы, с которыми вы сталкиваетесь при его использовании. - person Youming Lin; 13.01.2017
comment
Чтобы решить проблему с исключением, я перекомпилировал все зависимые библиотеки моего проекта, а затем у меня возникла проблема между Kitura и KituraNet, которые все вместе объявляют ошибку перечисления. - person Notux; 14.01.2017
comment
Я реструктурировал весь свой проект, и теперь он компилируется и запускается. Вроде работает, продолжаю свои опыты. Спасибо. - person Notux; 14.01.2017
comment
github.com/Bouke/HAP/blob/master/ Sources / HAP / Server / - это подход с использованием базовых классов Kitura для создания HTTP-сервера для Homekit. - person Klaas; 29.09.2017