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