在ChatGPT官網(wǎng)我們可以看到,對話的方式僅僅只有一個post
請求,而沒有使用IM
中使用的websocket
鏈接。

同時我們可以看到與普通的post
請求不一樣的是,返回信息Response
沒有了,取而代之的是EventStream
。
那么這個EventStream
是什么東西?
一通查證后,發(fā)現(xiàn)這個是Web API中的EventSource
接口返回的數(shù)據(jù)。
MDN的官方描述是這樣的(傳送門):
EventSource
接口是 web 內(nèi)容與服務(wù)器發(fā)送事件
一個 EventSource
實例會對HTTP服務(wù)器開啟一個持久化的連接,以 text/event-stream
格式發(fā)送事件,此連接會一直保持開啟直到通過調(diào)用 EventSource.close()
關(guān)閉。
好家伙,還有這好東西。是我以前孤陋寡聞了。
經(jīng)過一番對比,總結(jié)了一下 EventSource
和 Websocket
的區(qū)別和優(yōu)劣:
EventSource:
簡單易用:EventSource API非常簡單,易于使用和理解。
服務(wù)器推送:EventSource適用于服務(wù)器主動向客戶端推送數(shù)據(jù),客戶端只能接收服務(wù)器發(fā)送的事件。
自動重連:EventSource會自動處理連接斷開和重新連接的情況,適用于長期保持連接并接收事件流的場景。
兼容性:EventSource在大多數(shù)現(xiàn)代瀏覽器中得到支持。
WebSocket:
雙向通信:WebSocket支持雙向通信,客戶端和服務(wù)器可以彼此發(fā)送數(shù)據(jù)。
實時性:WebSocket提供了更低的延遲和更快的數(shù)據(jù)傳輸速度,適用于實時性要求較高的應(yīng)用場景。
豐富的功能:WebSocket提供了更多的功能,例如數(shù)據(jù)幀的自定義和二進制數(shù)據(jù)的傳輸?shù)取?/p>
復(fù)雜性:WebSocket API相對于EventSource更為復(fù)雜,使用起來可能需要更多的代碼和理解。
需要服務(wù)器支持:使用WebSocket需要服務(wù)器端實現(xiàn)對應(yīng)的WebSocket協(xié)議,而EventSource只需要服務(wù)器端支持發(fā)送事件即可。
兼容性:相對于EventSource,WebSocket在某些較舊的瀏覽器或網(wǎng)絡(luò)環(huán)境中的支持可能不夠廣泛。
綜上所述,EventSource
適用于服務(wù)器主動推送事件給客戶端,并且在保持長期連接和接收事件流時表現(xiàn)良好。 WebSocket
適用于需要實時雙向通信和更豐富功能的場景,但需要服務(wù)器端和客戶端都支持 WebSocket
協(xié)議,選擇使用哪種技術(shù)應(yīng)基于具體需求和應(yīng)用場景進行評估。
那么有了上面的結(jié)論我們再來看看,為什么 ChatGPT
對話為什么不用 Websocket
而使用 EventSource
?
當然,ChatGPT
對話可以使用Websocket
或EventSource
進行實時通信,下面是我個人的總結(jié):
服務(wù)器推送:EventSource
專注于服務(wù)器向客戶端主動推送事件的模型,這對于ChatGPT
對話非常適用。ChatGPT
通常是作為一個長期運行的服務(wù),當有新的回復(fù)可用時,服務(wù)器可以主動推送給客戶端,而不需要客戶端頻繁發(fā)送請求。
自動重連和錯誤處理:EventSource
具有內(nèi)置的自動重連機制,它會自動處理連接斷開和重新連接的情況。這對于ChatGPT
對話而言很重要,因為對話可能需要持續(xù)一段時間,連接的穩(wěn)定性很重要。
簡單性和易用性:相對于WebSocket
,EventSource
的API更加簡單易用,只需實例化一個EventSource
對象,并處理服務(wù)器發(fā)送的事件即可。這使得開發(fā)者可以更快速地實現(xiàn)對話功能,減少了一些復(fù)雜性。
廣泛的瀏覽器支持:EventSource
在大多數(shù)現(xiàn)代瀏覽器中得到廣泛支持,包括移動端瀏覽器。相比之下,WebSocket
在某些舊版本的瀏覽器中可能不被完全支持,需要考慮兼容性問題。
需要注意的是,WebSocket
也是一種很好的選擇,特別是當需要實現(xiàn)更復(fù)雜的實時雙向通信、自定義協(xié)議等功能時,或者對瀏覽器的兼容性要求較高時。最終選擇使用WebSocket
還是EventSource
應(yīng)該根據(jù)具體的項目需求和技術(shù)考慮來確定。