今天試著寫一個PHP 與C 語言通過socket通訊的程序,看過PHP手冊,發現有好幾種方式可以建立socket 客戶端.
1、通過fsockopen() 建立socket連接,然後用用fputs( ) 發送訊息,用fgets() 接收訊息。
2、透過 socket_create() 建立 socket 連接,然後用 socket_send() or socket_write() 發送訊息,用 socket_recv() 或 socket_read() 發送訊息。
很奇怪,我在手冊上看到了這樣一段話"本擴展模組是實驗性的。該模組的行為,包括其函數的名稱以及其它任何關於此模組的文檔可能會在沒有通知的情況下隨PHP 往後的發布而改變。
今天我寫的客戶端要與服務端做兩次通訊,我用上面這個方法都寫了一個客戶端程序,發現當僅僅就一次通訊的時候,也就是PHP客戶端發送一次訊息,然後接收返回訊息,就關閉連線。這兩種方法都能正確快速的實現功能,但當做兩次通訊時,卻有明顯的差別,第一種方法第一次通訊特別快就結束了,這個我可以透過服務端的輸出看出來,但是第二次通訊要等上好幾分鐘才能結束,我試了好幾次都這樣,我不太清楚我的程式哪裡出錯了,還是這個方式連接就是有問題,但是第二種方法做這兩次通訊卻很快,正確!完成的非常的。
最後我根據 第二種情況寫了一個 class
////////////////////////////// File Description ////////////////////////////////////////// // Class Name : socket // Version : V1.0 // Functional Outline : create socket,and send message to server // Revision history : 2004/12/15 First version created // Current : 2004/12/15 Liu Yongsheng ////////////////////////////////////////////////////////////////////////////////////////// class socket{ var $socket; //socket 句柄 var $sendflag = ">>>"; var $recvflag = "<<<"; var $response; var $debug = 1; function socket($hostname,$port){ $address = gethostbyname($hostname); $this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $result = socket_connect($this->socket,$address,$port); if($this->debug == 1){ if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "<br>"; } else{ echo "connect OK.<br>"; } } } function sendmsg($msg){ socket_write($this->socket,$msg,strlen($msg)); $result = socket_read($this->socket,100); $this->response = $result; if($this->debug == 1){ printf("<font color=#CCCCCC>%s $msg</fon><br>",$this->sendflag); printf("<font color=blue>%s $result</font><br>",$this->recvflag); } return $result; } function close(){ socket_close($this->socket); } }
以上就是PHP技術進階 PHP SOCKET 技術研究的內容,更多相關文章請關注PHP中文網(www.php.cn)!