yanivps
yanivps

Reputation: 2163

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

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

fiddler sse

Upvotes: 7

Views: 2765

Answers (1)

Darren Cook
Darren Cook

Reputation: 28913

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).

Upvotes: 7

Related Questions