socket 初步使用

來源:互聯網
上載者:User

標籤:style   blog   color   使用   os   strong   資料   for   

   socket分為2個部分,1部分是伺服器端,監聽某個介面,當有用戶端有請求時,自動運行代碼。

第二個部分是用戶端,來傳送資料。

<?php    //伺服器連接埠
    header(‘Content-type:text/html;Charset=GBK‘);    //伺服器段程式,監聽借口,並進行相應的資料處理    /*        socket 伺服器通訊整個過程        socket_creat        socket_bind        socket_listen        socket_accetp        socket_read        socket_write        socket_close    */    //1,建立通訊節點    $socket             = socket_create(AF_INET,SOCK_STREAM,0);    if(!$socket)        exit(‘create error : ‘ . socket_strerror(socket_last_error()));    //2,綁定製定連接埠    $ip                 = ‘127.0.0.1‘;    $port                 = ‘1935‘;    $res                 = socket_bind($socket,$ip,$port);    if(!$res)        exit(‘bind error:‘ . socket_strerror(socket_last_error()));    //3, 開始監聽    $res                 = socket_listen($socket);    if(!$res)        exit(‘listen error ‘ . socket_strerror(socket_last_error()));    //4,接收一個通訊,處理    do {        $msgsock         = socket_accept($socket);        if(!$msgsock)            exit(‘accetp error:‘ . socket_strerror(socket_last_error()));        //讀出用戶端傳入的資料        $msgclient         = socket_read($msgsock, 1024);        if($msgclient === false)            exit(‘read error:‘ . socket_strerror(socket_last_error()));        echo ‘收到用戶端資料:‘ . $msgclient;        //返回資訊        $remsg             = ‘已經收到請求!處理完畢!123‘;        $res             = socket_write($msgsock, $remsg);        if($res === false)            exit(‘write error :‘ . socket_strerror(socket_last_error()));        //相關操作        echo ‘進行中操作...‘;        sleep(10);        //釋放資源        socket_close($msgsock);    }while(true);    //5,釋放資源    socket_close($socket);
//觸發連接埠,讓伺服器程式運行,連接埠設定為 1935    //初始化    $ip             = ‘127.0.0.1‘;    $port             = ‘1935‘;    /*        socket連結整個過程        1,socket_create        第一個參數指定應用程式使用的通訊協定的協議族,對於TCP/IP協議族,該參數置AF_INET;        第二個參數指定要建立的通訊端類型,流通訊端類型為SOCK_STREAM、資料通訊端類型為SOCK_DGRAM、原始通訊端SOCK_RAW(WinSock介面並不適用某種特定的協議去封裝它,而是由程式自行處理資料包以及協議首部);        第三個參數指定應用程式所使用的通訊協定。此參數可以指定單個協議系列中的不同傳輸協議。在Internet通訊域中,此參數一般取值為0,系統會根據通訊端的類型決定應使用的傳輸層協議。        2,socket_connect        3,socket_write        4,socket_read        5,socket_close    */    //1,建立通訊節點    $socket         = socket_create(AF_INET,SOCK_STREAM,0);    if($socket === false)        exit(‘建立節點失敗!錯誤資訊:‘ . socket_strerror(socket_last_error()));    echo ‘建立節點成功,準備連結...‘,‘<br />‘;    //2,開始連結    $res             = socket_connect($socket,$ip,$port);    if (!$res) {        exit(‘串連節點失敗!失敗原因:‘ . socket_strerror(socket_last_error()));    }    echo ‘連結成功!準備發送....‘,‘<br />‘;    //3,發送資料    $buffer         = ‘發送一個請求!‘ . "\r\n";    $res             = socket_write($socket, $buffer);    if($res === false)        exit(‘發送請求失敗!失敗原因:‘ . socket_strerror(socket_last_error()));    //4,接受伺服器回傳資訊    $out             = socket_read($socket, 8192);    if ($out === false) {        exit(‘擷取伺服器回傳內容失敗!原因:‘ . socket_strerror(socket_last_error()));    }    if ($out)        echo ‘擷取到伺服器回傳內容--><strong style="color:red">‘ . $out . ‘</strong>‘;    else         echo ‘伺服器沒有回傳內容!‘;    //關閉連結    socket_close($socket);

運行後發現缺點,就是還是單進程的。

當伺服器運行速度很慢時候,會造成用戶端長時間的等待。不利於使用者體驗。

目前自己的想法是就要利用php實現多進程來配合使用,多進程的實現為一般有兩種方法,一種是使用PHP內建的pcntl_*函數(僅限linux),另一種就是使用popen/proc_open,然後在php內部控制進程數量。

明天進行研究。(linux下使用fork。)

目前只是簡單的瞭解並且使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.