Erlang Socket訊息獲取模式主動 被動 混合
1、主動訊息獲取(非阻塞)
第一個例子是以主動模式開啟socket,然後接受來自socket的資料:
{ok,Listen} = gen_tcp:listen(Port,[…,{active,true}…]),
{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).
loop(Socket) ->
receive
{tcp,Socket,Data} -> … 輸出處理 …
{tcp_closed,Socket} -> …
end.
這個過程無法控制發到伺服器迴圈的訊息流,如果客戶端產生資料的速度大於伺服器消費資料的速度,系統就會收到洪水般地訊息-訊息緩衝區溢位,系統將會crash並表現怪異。
這種型別的伺服器叫做非阻塞伺服器,因為它無法阻塞客戶端。我們僅在信任客戶端的情況下才會使用非阻塞伺服器。
2 被動訊息獲取(阻塞)
在這一節,我們寫阻塞伺服器:伺服器以被動模式開啟socket,通過 {active,false} 選項。這個伺服器不會被危險的客戶端洪水襲擊。
伺服器迴圈中的程式碼呼叫 gen_tcp:recv 來接收資料。客戶端在伺服器呼叫 recv 之前會被阻塞。注意OS會對客戶端發來的資料做一下緩衝,以允許客戶端在伺服器呼叫 recv 之前仍然可以繼續傳送一小段資料。
{ok,Listen} = gen_tcp:listen(Port,[…,{active,false}…]),
{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).
loop(Socket) ->
case gen_tcp:recv(Socket,N) of {ok,B} -> … 資料處理 … loop(Socket);
{error,closed} …
end.
3 混合訊息獲取(部分阻塞)
你可能認為把被動模式用到所有伺服器上都合適。不幸的是,當我們在被動模式時,我們只能等待來自於一個socket的資料。這對於需要等待多個socket來源資料的伺服器則不適用。
幸運的是我們可以用混合方式,既不是阻塞的也不是非阻塞的。我們以一次主動(active once)模式 {active,once} 開啟socket。在這個模式中,socket是主動的,但是隻能接收一條訊息。在控制程式發出一條訊息之後,他必須明確的呼叫 inet:setopts 以便讓socket恢復並接收下一條訊息。系統在這發生之前會一直阻塞。這是兩種世界的最好結合點。如下是程式碼:
{ok,Listen} = gen_tcp:listen(Port,[…,{active,once}…]),
{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).
loop(Socket) ->
receive
{tcp,Socket,Data} -> … 資料處理 … %%準備好啟用下一條訊息時
inet:setopts(Socket,[{active,once}]),
loop(Socket);
{tcp_closed,Socket} -> …
end.
使用 {active,once} 選項,使用者可以實現高層次的資料流控制(有時叫交通管制),同時又防止了伺服器被過多的訊息洪水所淹沒。
相關文章
- FTP主動模式和被動模式FTP模式
- zabbix的主動模式和被動模式模式
- Zabbix設定主動模式與被動模式模式
- Zabbix 主被動模式解析模式
- zabbix-agent被動模式變為主動模式模式
- Zabbix——zabbix-agent被動模式變主動模式模式
- zabbix被動模式和主動模式的區別模式
- FTP主動模式和被動模式的區別FTP模式
- 自定義訊息獲取訊息(轉)
- Ftp - 主被動模式說明及修改模式命令FTP模式
- OCX 控制元件主動傳送訊息給 MFC 視窗訊息控制元件
- ftp的主動和被動模式和vsftp服務FTP模式
- 前端開發模式:被動編譯和主動編譯前端模式編譯
- zabbix 預設item採集使用被動模式 需要改為主動模式模式
- FTP主動模式和被動模式(2)- 防火牆對FTP的影響 ASPFFTP模式防火牆
- 主動FTP與被動FTPFTP
- 主動筆記與被動筆記筆記
- 適合C# Actor的訊息執行方式(1):Erlang中的模式匹配C#模式
- android粘性廣播主動獲取當前值Android
- Fastapi整合SSE服務後端主動推送訊息到前端ASTAPI後端前端
- vscode原始碼分析【七】主程式啟動訊息通訊服務VSCode原始碼
- 【原始碼】RocketMQ如何實現獲取指定訊息原始碼MQ
- iOS 程式碼 獲取wifi資訊 及主動連線WiFiiOSWiFi
- 智慧手環主動預警水文資料API獲取API
- Protobuf_動態訊息-反射反射
- JDBC 獲取被插入資料的主鍵ID值JDBC
- RabbitMQ訊息模式MQ模式
- 一種適合C# Actor的訊息執行方式(上):Erlang中的模式匹配C#模式
- Zabbix-agent主動模式模式
- Java socket 獲取gps定位Java
- php動態獲取常量PHP
- netty建立數萬客戶端連線,並主動發訊息Netty客戶端
- SpringCloud-Stream 訊息驅動SpringGCCloud
- SpringCloud(七)Stream訊息驅動SpringGCCloud
- 九. SpringCloud Stream訊息驅動SpringGCCloud
- 訊息提示彈層滾動JQUERRY
- 使用Erlang訊息機制實現穩定婚姻問題
- RocketMQ -- 訊息拉取MQ