SSE Server Sent Events - Client keep sending requests (like pooling)

大兔子大兔子 提交于 2019-12-07 16:26:56

问题


How come every site explains that in SSE a single connection stays opened between client and server "With SSE, a client sends a standard HTTP request asking for an event stream, and the server responds initially with a standard HTTP response and holds the connection open"

And then, when server decides it can send data to the client while what I am trying to implement SSE I see on fiddler requests being sent every couple of seconds

For me it feels like long polling and not a one single connection kept opened.

Moreover, It is not that the server decides to send data to the client and it sends it but it sends data only when the client sends next request

If i respond with "retry: 10000" even tough something has happened that the server wants to notify right now, will get to the client only on the next request (in 10 seconds from now) which for me does not really looks like connection that is kept opened and server sends data as soon as he wants to


回答1:


Your server is closing the connection immediately. SSE has a built-in retry function for when the connection is lost, so what you are seeing is:

  • Client connects to server
  • Server myteriously dies
  • Client waits two seconds then auto-reconnects
  • Server myteriously dies
  • Client waits two seconds then auto-reconnects
  • ...

To fix the server-side script, you want to go against everything your parents taught you about right and wrong, and deliberately create an infinite loop. So, it will end up looking something like this:

validate user, set up database connection, etc.
while(true){
  get next bit of data
  send it to client
  flush
  sleep 2 seconds
  }

Where get next bit of data might be polling a DB table for new records since the last poll, or scan a file system directory for new files, etc.

Alternatively, if the server-side process is a long-running data analysis, your script might instead look like this:

validate user, set-up, etc.
while(true){
  calculate next 1000 digits of pi
  send them to client
  flush
  }

This assumes that the calculate line takes at least half a second to run; any more frequently and you will start to clog up the socket with lots of small packets of data for no benefit (the user won't notice that they are getting 10 updates/second instead of 2 updates/second).



来源:https://stackoverflow.com/questions/30415012/sse-server-sent-events-client-keep-sending-requests-like-pooling

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!