標籤: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。)
目前只是簡單的瞭解並且使用。