第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大猩猩Websocket中的WriteMessage和ReadMessage如何工作?

大猩猩Websocket中的WriteMessage和ReadMessage如何工作?

Go
幕布斯7119047 2022-08-01 15:13:39
我正在與Gorilla Websocket合作,并對WriteMessage和ReadMessage功能的工作原理感到好奇。WriteMessage 函數(shù)是否同步將字節(jié)數(shù)據(jù)發(fā)送到客戶端?或者 ReadMessage 是否主動從服務器獲取數(shù)據(jù)(根據(jù)文檔,我們需要創(chuàng)建一個事件循環(huán)來調用 ReadMessage 函數(shù))。如果服務器繼續(xù)調用 WriteMessage,但沒有人讀取消息(客戶端通過事件循環(huán)調用 ReadMessage 函數(shù)),數(shù)據(jù)是丟失了,還是一直保留到下一個讀取請求,會發(fā)生什么情況?謝謝。
查看完整描述

2 回答

?
精慕HU

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ù)才會丟失。


查看完整回答
反對 回復 2022-08-01
?
RISEBY

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


查看完整回答
反對 回復 2022-08-01
  • 2 回答
  • 0 關注
  • 269 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號