ChatGPT解决这个技术问题 Extra ChatGPT

WebSockets vs. Server-Sent events/EventSource

Both WebSockets and Server-Sent Events are capable of pushing data to browsers. To me they seem to be competing technologies. What is the difference between them? When would you choose one over the other?

Not sure how you see them as competing. One is synchronous and could/would be used for near real-time data xfer, whereas the other is asynchronous and would serve an entirely different purpose (effectively sending toast-like messages from a server-side app).
One thing I really like about SSE is that it's easy to troubleshoot...just open a request to your SSE server using curl. Since it's just a text format over HTTP, it's easy to see what's going on.
@BrianDriscoll - asynchronous/synchronous - which is which? As far as I can understand both enable asynchronous transfers?
SSE doesn't work on IE, websockets does
@cellepo See MDN's page on SSE. It lists several polyfills. Remy Sharp's is 186 lines, which you could trim down quite a bit to the essentials, but yeah, 50 lines were a bit under ... ;)

A
Alex Recarey

Websockets and SSE (Server Sent Events) are both capable of pushing data to browsers, however they are not competing technologies.

Websockets connections can both send data to the browser and receive data from the browser. A good example of an application that could use websockets is a chat application.

SSE connections can only push data to the browser. Online stock quotes, or twitters updating timeline or feed are good examples of an application that could benefit from SSE.

In practice since everything that can be done with SSE can also be done with Websockets, Websockets is getting a lot more attention and love, and many more browsers support Websockets than SSE.

However, it can be overkill for some types of application, and the backend could be easier to implement with a protocol such as SSE.

Furthermore SSE can be polyfilled into older browsers that do not support it natively using just JavaScript. Some implementations of SSE polyfills can be found on the Modernizr github page.

Gotchas:

SSE suffers from a limitation to the maximum number of open connections, which can be specially painful when opening various tabs as the limit is per browser and set to a very low number (6). The issue has been marked as "Won't fix" in Chrome and Firefox. This limit is per browser + domain, so that means that you can open 6 SSE connections across all of the tabs to www.example1.com and another 6 SSE connections to www.example2.com (thanks Phate).

Only WS can transmit both binary data and UTF-8, SSE is limited to UTF-8. (Thanks to Chado Nihi).

Some enterprise firewalls with packet inspection have trouble dealing with WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).

HTML5Rocks has some good information on SSE. From that page:

Server-Sent Events vs. WebSockets Why would you choose Server-Sent Events over WebSockets? Good question. One reason SSEs have been kept in the shadow is because later APIs like WebSockets provide a richer protocol to perform bi-directional, full-duplex communication. Having a two-way channel is more attractive for things like games, messaging apps, and for cases where you need near real-time updates in both directions. However, in some scenarios data doesn't need to be sent from the client. You simply need updates from some server action. A few examples would be friends' status updates, stock tickers, news feeds, or other automated data push mechanisms (e.g. updating a client-side Web SQL Database or IndexedDB object store). If you'll need to send data to a server, XMLHttpRequest is always a friend. SSEs are sent over traditional HTTP. That means they do not require a special protocol or server implementation to get working. WebSockets on the other hand, require full-duplex connections and new Web Socket servers to handle the protocol. In addition, Server-Sent Events have a variety of features that WebSockets lack by design such as automatic reconnection, event IDs, and the ability to send arbitrary events.

TLDR summary:

Advantages of SSE over Websockets:

Transported over simple HTTP instead of a custom protocol

Can be poly-filled with javascript to "backport" SSE to browsers that do not support it yet.

Built in support for re-connection and event-id

Simpler protocol

No trouble with corporate firewalls doing packet inspection

Advantages of Websockets over SSE:

Real time, two directional communication.

Native support in more browsers

Ideal use cases of SSE:

Stock ticker streaming

twitter feed updating

Notifications to browser

SSE gotchas:

No binary support

Maximum open connections limit


Chat is perfectly doable with SSE – you can use regular POST to send messages to the server. WebSockets would be needed only if you're implementing chat a'la Google Wave.
It's true that chat and other real time applications can be done with SSE. However, this requires POSTing replies "out of band", ie, this is not controlled by the SSE protocol, and does not seem like a good example for a basic explanation on the differences between SSE and Websockets. You can implement chat with basic HTTP polling the server every second and POSTing new replies. This does not mean it's the best / most elegant way of doing it.
I think that pomeL's solution is a great compromise for most cases, since JS can always "push" things to the server with an AJAX POST. From my experience, the main issue has generally been the need for JS to poll for new information, but SSE takes care of that. :D
@MattDiPasquale Wave sent every key individually as you typed it instead of complete message at once. 200 bytes of POST overhead for 1 keystroke would be wasteful compared to about 6 for WebSocket.
It seems a little odd to say they are not competing technologies, and then proceed to describe that they can both be used to achieve similar solutions. I would say that makes them competing.
G
Gras Double

According to caniuse.com:

98.33% of global users natively support WebSockets

97.67% of global users natively support Server-sent events

You can use a client-only polyfill to extend support of SSE to many other browsers. This is less likely with WebSockets. Some EventSource polyfills:

EventSource by Remy Sharp with no other library dependencies (IE7+)

jQuery.EventSource by Rick Waldron

EventSource by Yaffle (replaces native implementation, normalising behaviour across browsers)

If you need to support all the browsers, consider using a library like web-socket-js, SignalR or socket.io which support multiple transports such as WebSockets, SSE, Forever Frame and AJAX long polling. These often require modifications to the server side as well.

Learn more about SSE from:

HTML5 Rocks article

The W3C spec (published version, editor's draft)

Learn more about WebSockets from:

HTML5 Rocks article

The W3C spec (published version, editor's draft)

Other differences:

WebSockets supports arbitrary binary data, SSE only uses UTF-8


I would like to point out in 2016 > 95% of global users natively support WebSockets. All browsers and devices have supported WebSockets for over 4 years. Socket.IO will fallback to AJAX long polling and handle the complexities of emulating WebSockets for you if it's not supported, which makes support 100%. If you're using anything but WebSockets in 2016, you're using outdated technology.
@NickSteele That's a bullshit hype statement. Relying on older standards is perfectly fine if they meet your use case and doesn't mean anything is outdated. It's just a different standard. Ex: XHR can still do lots of stuff the Fetch API cannot do, so it's not outdated. It's different. I've used WS in the past, but know from experience that one can hit snags in the form of noise enterprise firewalls that block requests when it doesn't understand WS. SSE is super-efficient for what it does, is trivially understandable and implementable and easy to debug. For our one-way dataflow, it's perfect.
Replace BS with hyperbole then :-) WS is not a replacement for XHR/HTTP any more than drones are for delivery cars. It's different use cases. WS is not HTTP and have different sweet spots. You'd end up reimplementing HTTP (poorly) in user space if you'd try. Also, you are implying things which are not given facts: WS is simply a bidirectional protocol supporting server push. I've never seen any design docs mention it being developed as the replacement for anything. Source? Age in itself is not a factor. When given a choice, choose the simplest implementation checking all your requirements.
It's just two years ago (2017) I was debugging heap dumps of Node JS processes where the Socket.io code was causing massive memory fragmentation in the IIS process, ending up talking directly with Azure's Node team. The total complexity is not for free. If you can get away with a simple 20 line script as your dependency on the server, while still being able to serve 100K clients, I'd go for it. I love WS for what it does, though, but look at what you need before choosing a solution.
Meanwhile (2021): WebSockets 97%, SSE 96%.
Y
Yaffle

Opera, Chrome, Safari supports SSE, Chrome, Safari supports SSE inside of SharedWorker Firefox supports XMLHttpRequest readyState interactive, so we can make EventSource polyfil for Firefox


G
Gaurav Tiwari

Websocket VS SSE

Web Sockets - It is a protocol which provides a full-duplex communication channel over a single TCP connection. For instance a two-way communication between the Server and Browser Since the protocol is more complicated, the server and the browser has to rely on library of websocket which is socket.io

Example - Online chat application.

SSE(Server-Sent Event) - In case of server sent event the communication is carried out from server to browser only and browser cannot send any data to the server. This kind of communication is mainly used when the need is only to show the updated data, then the server sends the message whenever the data gets updated. For instance a one-way communication between the Server to Browser. This protocol is less complicated, so no need to rely on the external library JAVASCRIPT itself provides the EventSource interface to receive the server sent messages.

Example - Online stock quotes or cricket score website.

on browser side websockets are baked into the browser so no external library is required on browser side
D
Drew LeSueur

One thing to note: I have had issues with websockets and corporate firewalls. (Using HTTPS helps but not always.)

See https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94

I assume there aren't as many issues with Server-Sent Events. But I don't know.

That said, WebSockets are tons of fun. I have a little web game that uses websockets (via Socket.IO) (http://minibman.com)


I also have had issues with corporate firewalls.
One issue I have seen with Server-Sent Events are that some proxies/firewalls might block it because it doesn't have a Content-Length header
Also Nginx can block it if the X-Accel-Buffering header isn't set to no
Z
Zim

they are different in semantics.

websocket has a native semantic meaning of "bidirectional data stream".

while sse has a native semantic meaning of "publish-subscribe pattern" or "request-respond pattern, despite the response is a stream".

of course you can implement a layer of "pub-sub pattern" or "req-res pattern" over websocket by yourself. but that's less efficient.