2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
WriteMessage 函數(shù)是否同步將字節(jié)數(shù)據(jù)發(fā)送到客戶端?
WriteMessage 將數(shù)據(jù)寫入基礎網(wǎng)絡連接。
操作系統(tǒng)網(wǎng)絡連接維護要傳輸?shù)綄Φ润w的數(shù)據(jù)緩沖區(qū)。當對等方確認對等體接收到數(shù)據(jù)時,將從緩沖區(qū)中刪除數(shù)據(jù)。
寫入操作系統(tǒng)網(wǎng)絡連接將在所有應用程序數(shù)據(jù)添加到緩沖區(qū)后返回。寫入可能會阻止等待緩沖區(qū)中的空間。
幾乎總是在對等體接收數(shù)據(jù)之前返回應用程序寫入調用。成功調用 WriteMessage 確實意味著對等應用程序讀取數(shù)據(jù)。
或者 ReadMessage 是否主動從服務器獲取數(shù)據(jù)(根據(jù)文檔,我們需要創(chuàng)建一個事件循環(huán)來調用 ReadMessage 函數(shù))。
讀取消息調用在基礎網(wǎng)絡連接上讀取。
操作系統(tǒng)緩沖從對等體接收的一定量數(shù)據(jù)。
讀取操作網(wǎng)絡連接塊,直到緩沖區(qū)中有數(shù)據(jù)可用。
如果服務器繼續(xù)調用 WriteMessage,但沒有人閱讀該消息,會發(fā)生什么情況。
WriteMessage 最終將阻止在操作系統(tǒng)傳輸緩沖區(qū)中等待空間。
使用寫入截止時間來防止在死亡或卡住的對等體上永久阻塞。
數(shù)據(jù)是丟失了,還是一直保留到下一個讀取請求出現(xiàn)?
數(shù)據(jù)保存在操作系統(tǒng)的傳輸和接收緩沖區(qū)中。
當傳輸緩沖區(qū)已滿時,應用程序寫入 websocket 連接塊。
僅當對等應用程序在對等應用程序讀取數(shù)據(jù)之前終止時,數(shù)據(jù)才會丟失。

TA貢獻1856條經(jīng)驗 獲得超5個贊
您可以在此處找到該函數(shù)的源代碼:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L751-L774
看起來這是阻止/同步方法。
根據(jù)跟蹤 他們在這里創(chuàng)建作家:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L766
w, err := c.NextWriter(messageType)
然后他們寫:data
if _, err = w.Write(data); err != nil {
return err
}
這是阻塞,因為它們正在關閉該函數(shù)的最后一行中的連接,因此必須在此時完成寫入。
這是返回到變量中的接口的行為。io.WriteCloserw
如果服務器繼續(xù)調用 WriteMessage,但沒有人讀取消息(客戶端通過事件循環(huán)調用 ReadMessage 函數(shù)),數(shù)據(jù)是丟失了,還是一直保留到下一個讀取請求,會發(fā)生什么情況?謝謝。
應設置寫入/讀取超時。
庫不會重復為您發(fā)送數(shù)據(jù)。您需要在應用程序中實現(xiàn)此邏輯。
如果服務器啟動并收到您的連接,(可能)它將讀取您的消息(如果在執(zhí)行數(shù)據(jù)之前未停止)。
如果您發(fā)送了消息并且服務器已死(未收到您的消息),則您的數(shù)據(jù)將丟失。
其他參考:
功能:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L650-L675w.Write
接口描述:https://golang.org/pkg/io/#WriteCloserio.WriteCloser
戈里拉·韋伯塞特超時:https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetReadDeadline
Gorila 的超時文檔:https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetReadDeadline
- 2 回答
- 0 關注
- 269 瀏覽
添加回答
舉報