erlang之三種socket訊息迴圈

來源:互聯網
上載者:User

轉載:高手http://hi.baidu.com/zai215837829/blog/item/2e8323dc3763c02e5982dd80.html

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} 選項,使用者可以實現高層次的資料流控制(有時叫交通管制),同時又防止了伺服器被過多的訊息洪水所淹沒。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.