這篇文章主要介紹了php能不能實(shí)現(xiàn)socket通信的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇php能不能實(shí)現(xiàn)socket通信文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
創(chuàng)新新互聯(lián),憑借十年的網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有1000多家案例。做網(wǎng)站建設(shè),選成都創(chuàng)新互聯(lián)。
php能實(shí)現(xiàn)socket通信,其實(shí)現(xiàn)方法:1、在客戶端創(chuàng)建“socketsocket_create();”并向服務(wù)器請(qǐng)求連接“socket_connect();”;2、在服務(wù)端創(chuàng)建“socketsocket_create();”并綁定IP和端口號(hào)“socket_bind();”;3、通過(guò)“socket_wirte();socket_read”讀客戶端的消息或給客戶端寫(xiě)消息即可。
目標(biāo):我希望通過(guò)套接字的TCP傳輸來(lái)搭建一個(gè)服務(wù)器,這個(gè)服務(wù)器的作用是:接受多個(gè)客戶端的連接并完成他們的相互通信。比如客戶端A,客戶端B同時(shí)連接到服務(wù)器S,客戶端A向服務(wù)器S發(fā)送消息,服務(wù)器S會(huì)將A的消息轉(zhuǎn)發(fā)給B,同理,B的消息也可以通過(guò)S被轉(zhuǎn)發(fā)到A。這樣就實(shí)現(xiàn)了客戶端A和客戶端B之間的相互通信。
本次我們只實(shí)現(xiàn)客戶端與服務(wù)器之間連接并通信,暫時(shí)沒(méi)有寫(xiě)服務(wù)器的轉(zhuǎn)發(fā)功能。
TCP的三次握手可以確保服務(wù)器和客戶端之間可以正常通信。三次握手的過(guò)程:至于這個(gè)過(guò)程的解釋,可以點(diǎn)擊下面的鏈接來(lái)查看。
服務(wù)器需要有一個(gè)IP,TCP通信時(shí),還需要提供一個(gè)端口號(hào)。
客服端需要有一個(gè)IP,TCP通信時(shí),也需要提供一個(gè)端口號(hào)。
個(gè)人理解:IP就是地址,可以理解為一個(gè)房子,當(dāng)你需要建立通信的時(shí)候,首先肯定得相互知道這個(gè)房子在哪里才可以吧,要不然我們得信息發(fā)送到哪里呢?
PORT端口,端口號(hào)可以理解為這個(gè)房子的一個(gè)門(mén),我們需要指定一個(gè)門(mén),將消息從這個(gè)門(mén)里面?zhèn)魉瓦M(jìn)去或者從這個(gè)門(mén)接受消息。
客戶端:
創(chuàng)建socketsocket_create();
向服務(wù)器請(qǐng)求連接socket_connect();
給服務(wù)器發(fā)送消息/接受服務(wù)器消息socket_wirte(); / socket_read();
關(guān)閉socketsocket_close();
服務(wù)器:
創(chuàng)建socketsocket_create();
綁定IP和端口號(hào)socket_bind();
監(jiān)聽(tīng)I(yíng)P和端口號(hào)(0.0.0.0表示任意IP)socket_listen();
阻塞等待客服端的連接socket_accept();
讀客戶端的消息/給客戶端寫(xiě)消息socket_wirte(); / socket_read();
關(guān)閉socketsocket_close();
服務(wù)器創(chuàng)建socket,并綁定IP和PORT,然后進(jìn)入監(jiān)聽(tīng)狀態(tài)等待客服端發(fā)起連接。
客戶端創(chuàng)建socket,對(duì)指定服務(wù)器IP和PORT進(jìn)行連接。
服務(wù)器接受客服端發(fā)起的連接。
雙方可以互相發(fā)送數(shù)據(jù)
雙方關(guān)閉socket。
這就是一個(gè)簡(jiǎn)要的通信過(guò)程,至于想要循環(huán)發(fā)送或者異常檢測(cè)就是一些細(xì)節(jié)方面的東西了。
安裝PHP。在這里我是直接安裝了XAMPP,這個(gè)軟件自行幫我安裝了PHP。如果是第一次使用php語(yǔ)言,可以直接百度安裝PHP,也可以安裝XAMPP。
系統(tǒng)環(huán)境配置。在運(yùn)行程序的時(shí)候,我是通過(guò)cmd進(jìn)行運(yùn)行的,所以需要對(duì)系統(tǒng)環(huán)境變量進(jìn)行配置。配置過(guò)程請(qǐng)參考:鏈接:PHP環(huán)境變量配置。
檢查php指令是否可以運(yùn)行。完成1、2兩個(gè)步驟之后,運(yùn)行cmd,并執(zhí)行命令php -v
,運(yùn)行完成之后會(huì)顯示PHP的版本號(hào)。
新建一個(gè)文件夾socket,在該文件夾下新建文本文檔并改名為client.phpNOTE:我的文件夾建在桌面上
打開(kāi)client.phpNOTE:如果你平時(shí)沒(méi)有php的編輯器,這個(gè)時(shí)候可以直接用記事本打開(kāi)client.php
寫(xiě)入程序NOTE:程序我這里直接給出,并給予注釋,大家可以結(jié)合2.2通信過(guò)程進(jìn)行理解,如有疑問(wèn)請(qǐng)留言
$PORT = 請(qǐng)輸入端口號(hào); //端口號(hào)請(qǐng)查看博文:*3.2.2 程序執(zhí)行*。設(shè)置有效端口:
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //創(chuàng)建socket/參數(shù)1:代表IPV4/參數(shù)2:流傳輸/參數(shù)3:TCP/
$result = socket_connect($client, "122.114.122.174", $PORT); //向指定地址/端口發(fā)出連接請(qǐng)求,連接結(jié)果返回到resule
if($result == false){ //這里我們簡(jiǎn)單的對(duì)連接結(jié)果進(jìn)行響應(yīng)/為了Debug方便
echo "ERROR CONNECT\n";
die();
} else {
echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立將要發(fā)送的消息
socket_write($client, $data); //將消息發(fā)送出去
socket_close($client); //關(guān)閉socket
?>
程序編寫(xiě)完畢,大家可以直接復(fù)制過(guò)去,或者直接下載。NOTE:程序直接運(yùn)行會(huì)報(bào)錯(cuò),我們需要指定一個(gè)端口號(hào),請(qǐng)繼續(xù)看下節(jié),如何運(yùn)行程序。
獲取程序。通過(guò)上節(jié),我們已經(jīng)有一個(gè)簡(jiǎn)單的客服端程序,下載請(qǐng)點(diǎn)擊。
查找有效端口。因?yàn)槲覀儸F(xiàn)在沒(méi)有服務(wù)器,所以需要借助別人提供的服務(wù)器地址及端口進(jìn)行調(diào)試。
操作步驟:
1.點(diǎn)擊這里打開(kāi)網(wǎng)頁(yè)
2.頁(yè)面的下方找到:122.114.122.174:xxxxx
3.將xxxxx部分替換到程序中的第二行并保存
網(wǎng)頁(yè)操作:
程序操作:
打開(kāi)cmd。如果沒(méi)有配置PHP的環(huán)境變量請(qǐng)查看:3.1 PHP安裝及環(huán)境配置
執(zhí)行命令cd desktop/socket
。目的是為了到socket文件夾,根據(jù)自己文件夾位置填寫(xiě)相關(guān)路徑。
執(zhí)行客戶端程序php client.php
。這個(gè)時(shí)候如果報(bào)錯(cuò)PHP Fatal error,請(qǐng)查看點(diǎn)擊查看解決方法
最后,我們可以看到網(wǎng)頁(yè)里面接收到了信息。
NOTE:執(zhí)行程序后,如果不打印CONNECTED,等待一段時(shí)間,發(fā)現(xiàn)返回ERROR CONNET。這個(gè)是因?yàn)槲覀兊?strong>端口號(hào)過(guò)期了(只能使用3分鐘),重新返回網(wǎng)頁(yè)刷新并修改到程序中即可。如不能正確運(yùn)行,請(qǐng)留言!
如果不想自己敲,請(qǐng)直接點(diǎn)此下載并跳轉(zhuǎn):3.3.3 程序執(zhí)行。
新建一個(gè)文件夾socket(如有,請(qǐng)忽略),在該文件夾下新建文本文檔并改名為server.phpNOTE:我的文件夾建在桌面上
打開(kāi)server.phpNOTE:如果你平時(shí)沒(méi)有php的編輯器,這個(gè)時(shí)候可以直接用記事本打開(kāi)server.php
寫(xiě)入程序NOTE:程序我這里直接給出,并給予注釋,大家可以結(jié)合2.2通信過(guò)程進(jìn)行理解,如有疑問(wèn)請(qǐng)留言
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //創(chuàng)建socket/參數(shù)解釋同客服端
socket_bind($server, "0.0.0.0", 12345); //綁定端口和IP/0.0.0.0表示允許任意地址發(fā)起連接/12345表示允許12345端口號(hào)進(jìn)行連接
socket_listen($server); //進(jìn)入監(jiān)聽(tīng)
$connection = socket_accept($server); //接受請(qǐng)求并建立連接
$data = socket_read($connection, 1024); //接受數(shù)據(jù)
echo $data; //打印數(shù)據(jù)
socket_close($server);//關(guān)閉socket
?>
打開(kāi)文件夾socket(server.php所在文件夾),在該文件夾下新建文本文檔并改名為client.php(如有,請(qǐng)打開(kāi)直接修改程序即可) NOTE:我的文件夾建在桌面上
打開(kāi)client.phpNOTE:如果你平時(shí)沒(méi)有php的編輯器,這個(gè)時(shí)候可以直接用記事本打開(kāi)client.php
寫(xiě)入程序NOTE:程序我這里直接給出,并給予注釋,大家可以結(jié)合2.2通信過(guò)程進(jìn)行理解,如有疑問(wèn)請(qǐng)留言
$PORT = 12345; //與server端口匹配
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //創(chuàng)建socket/參數(shù)1:代表IPV4/參數(shù)2:流傳輸/參數(shù)3:TCP/
$result = socket_connect($client, "127.0.0.1", $PORT); //向指定地址/端口發(fā)出連接請(qǐng)求,連接結(jié)果返回到resule/127.0.0.1指本地IP
if($result == false){ //這里我們簡(jiǎn)單的對(duì)連接結(jié)果進(jìn)行響應(yīng)/為了Debug方便
echo "ERROR CONNECT\n";
die();
} else {
echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立將要發(fā)送的消息
socket_write($client, $data); //將消息發(fā)送出去
socket_close($client); //關(guān)閉socket
?>
獲取程序。通過(guò)上節(jié),我們已經(jīng)有一個(gè)本地客服端程序和一個(gè)服務(wù)器程序,下載請(qǐng)點(diǎn)擊
打開(kāi)cmd。如果沒(méi)有配置PHP的環(huán)境變量請(qǐng)查看:3.1
執(zhí)行命令cd desktop/socket
。注意:這個(gè)路徑需要根據(jù)自己實(shí)際情況填寫(xiě),直接下載的應(yīng)該是cd desktop/simple-socket-php/local-client-server
主要目的是為了找到server.php所在的文件夾,根據(jù)自己文件夾位置填寫(xiě)相應(yīng)路徑。
執(zhí)行服務(wù)器程序php server.php
。我們發(fā)現(xiàn)cmd卡住了,這個(gè)時(shí)候在等待客戶端連接進(jìn)來(lái)。這個(gè)時(shí)候如果報(bào)錯(cuò)PHP Fatal error,請(qǐng)查看點(diǎn)擊查看解決方法(如果想強(qiáng)制退出進(jìn)程按下Ctrl+C
)
再打開(kāi)一個(gè)cmd。
執(zhí)行命令cd desktop/socket
。注意:這個(gè)路徑需要根據(jù)自己實(shí)際情況填寫(xiě),直接下載的應(yīng)該是cd desktop/simple-socket-php/local-client-server
主要目的是為了找到client.php所在的文件夾,根據(jù)自己文件夾位置填寫(xiě)相應(yīng)路徑。
執(zhí)行客戶端程序php client.php
。(如果想強(qiáng)制退出進(jìn)程按下Ctrl+C
)
如果服務(wù)器沒(méi)有反應(yīng),請(qǐng)按下Ctrl+C
結(jié)束進(jìn)程,重新按照順序(先在一個(gè)CMD執(zhí)行server.php,再在另一個(gè)CMD執(zhí)行client.php)執(zhí)行程序。
關(guān)于“php能不能實(shí)現(xiàn)socket通信”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“php能不能實(shí)現(xiàn)socket通信”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。