2017-01-09 6 views
1

Я пытаюсь сделать клиент-серверное приложение с клиентской стороны на веб-сайте Angular2/typescript, а на стороне сервера - сервер Kitura в Swift на Mac OSX. На стороне клиента, код машинописи instanciates объекта EventSource:Сервер отправил события с Kitura

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), но я получаю immedi после получения уведомления об атаке и передачи ReadyState на «Подключение» (0). И так далее: соединение, закрытие, соединение, закрытие, ... И в результате почтовый запрос никогда не выполняется.

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

Спасибо,

Notux

ответ

1

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

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

+0

Спасибо за ваш ответ. Перед попыткой SSE я искал библиотеку сокетов Swift для веб-сайтов, и я не нашел что-то ценное, но я пропустил Kitura-WebSocket. Я изменил мою программу, чтобы использовать ее, но теперь у меня есть исключение, когда клиент пытается подключить сервер. Я исследую ... – Notux

+0

@Notux Мы только что опубликовали Kitura-WebSocket несколько дней назад, так что вполне понятно, что вы могли пропустить его во время своего поиска. Не стесняйтесь открывать любые проблемы, с которыми вы сталкиваетесь при его использовании. –

+0

Чтобы решить мою проблему исключения, я перекомпилировал все зависимые librairies моего проекта, а затем у меня возникла проблема между Kitura и KituraNet, которые вместе объявляют перечисление «Ошибка». – Notux

 Смежные вопросы

  • Нет связанных вопросов^_^