erlang tcp active 模式

gen_tcp 的 active的值爲once在編程上實現控制,

如果採用了非被被動模式,

虛擬機會把接受到的信息用一種消息的方式發給進程郵箱。

 

譬如下面是服務器接收的一段http請求,receiver:是每次接收的提示信息,

這裏可以看到http其實是按照先後順序發上來的,如果服務器是做http的,

用到once模式是最好不過的,如在第一條receiver匹配成功檢查格式正確後再決定是否接收

後面的,如果第一條就不對,後面就沒有必要再去取,這種數據有種依賴關係,

假如下面的所有匹配被分別看成是A,B ...J的話,如果不用once,那麼你的loop體大概是

這樣

 

loop() ->

    A ->done;

    B->done;

    ....

    J ->done

 

 

一次性要將所有的可能都寫上,如果是錯誤的格式,那麼可能C後面的一直不會匹配,而且也

影響函數風格

如果是once

loop() ->

  A ->done;

  B ->done;

上面A能匹配後再once

loop() ->

  C->done;

 

http://localhost:4017/web/ser

 

receiver:{http,#Port<0.2186>,{http_request,'GET',{abs_path,"/web/ser"},{1,1}}}

receiver:{http,#Port<0.2186>,

               {http_header,14,'Host',undefined,"127.0.0.1:4015"}}

receiver:{http,#Port<0.2186>,

               {http_header,24,'User-Agent',undefined,

                            "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17"}}

receiver:{http,#Port<0.2186>,

               {http_header,8,'Accept',undefined,

                            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}}

receiver:{http,#Port<0.2186>,

               {http_header,11,'Accept-Language',undefined,"en-us,en;q=0.5"}}

receiver:{http,#Port<0.2186>,

               {http_header,10,'Accept-Encoding',undefined,"gzip,deflate"}}

receiver:{http,#Port<0.2186>,

               {http_header,9,'Accept-Charset',undefined,

                            "ISO-8859-1,utf-8;q=0.7,*;q=0.7"}}

receiver:{http,#Port<0.2186>,{http_header,51,'Keep-Alive',undefined,"115"}}

receiver:{http,#Port<0.2186>,

               {http_header,2,'Connection',undefined,"keep-alive"}}

receiver:{http,#Port<0.2186>,http_eoh}

receiver:{tcp_closed,#Port<0.2186>}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章