PHP SOCKET 技術(shù)研究
發(fā)表時(shí)間:2024-01-30 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]今天試著寫一個(gè) PHP 與 C 語(yǔ)言通過(guò)socket通訊的程序,看過(guò)PHP手冊(cè),發(fā)現(xiàn)有好幾種方式可以建立socket 客戶端.1、通過(guò) fsockopen() 建立socket連接,然后用 用fputs() 發(fā)送消息,用 fgets() 接收消息。2、通過(guò) socket_create() 建立 s...
今天試著寫一個(gè) PHP 與 C 語(yǔ)言通過(guò)socket通訊的程序,看過(guò)PHP手冊(cè),發(fā)現(xiàn)有好幾種方式可以建立socket 客戶端.
1、通過(guò) fsockopen() 建立socket連接,然后用 用fputs() 發(fā)送消息,用 fgets() 接收消息。
2、通過(guò) socket_create() 建立 socket 連接,然后用 socket_send() or socket_write() 發(fā)送消息,用 socket_recv() or socket_read() 發(fā)送消息。
很奇怪,我在手冊(cè)上看到了這樣一段話"本擴(kuò)展模塊是實(shí)驗(yàn)性的。該模塊的行為,包括其函數(shù)的名稱以及其它任何關(guān)于此模塊的文檔可能會(huì)在沒(méi)有通知的情況下隨 PHP 以后的發(fā)布而改變。我們提醒您在使用本擴(kuò)展模塊的同時(shí)自擔(dān)風(fēng)險(xiǎn)。" 看來(lái) php4.0 socket通訊還不是完全穩(wěn)定。
今天我寫的客戶端要與服務(wù)端做兩次通訊,我用上面這個(gè)方法都寫了一個(gè)客戶端程序,發(fā)現(xiàn)當(dāng)僅僅就一次通訊的時(shí)候,也就是PHP客戶端發(fā)送一次消息,然后接收返回消息,就關(guān)閉連接。這兩種方法都能正確快速的實(shí)現(xiàn)功能,但當(dāng)做兩次通訊時(shí),卻有明顯的差別,第一種方法第一次通訊特別快就結(jié)束了,這個(gè)我可以通過(guò)服務(wù)端的輸出看出來(lái),但是第二次通訊要等上好幾分鐘才能結(jié)束,我試了好幾次都這樣,我不太清楚我的程序哪里出錯(cuò)了,還是這個(gè)方式連接就是有問(wèn)題,但是第二種方法做這兩次通訊卻很快,正確!完成的非常的。
最后我根據(jù) 第二種情況寫了一個(gè) 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);
}
}