首頁  >  文章  >  後端開發  >  php能實作socket通訊嗎

php能實作socket通訊嗎

藏色散人
藏色散人原創
2023-02-09 10:09:053519瀏覽

php能實作socket通信,其實作方法:1、在客戶端建立「socketsocket_create();」並向伺服器請求連接「socket_connect();」;2、在服務端建立「socketsocket_create() ;」並綁定IP和埠號「socket_bind();」;3、透過「socket_wirte();socket_read」讀取客戶端的訊息或寫入訊息給客戶端。

php能實作socket通訊嗎

本教學操作環境:Windows10系統、PHP8.1版、DELL G3電腦

php能實作socket通訊嗎?

socket PHP:詳細簡單的socket TCP通訊PHP實作

#1 背景介紹

目標:我希望透過套接字的TCP傳輸來搭建一個伺服器,這個伺服器的作用是:接受多個客戶端的連接並完成他們的相互通訊。例如客戶端A,客戶端B同時連接到伺服器S,客戶端A向伺服器S發送訊息,伺服器S會將A的訊息轉發給B,同理,B的訊息也可以透過S轉發到A。這樣就實作了客戶端A和客戶端B之間的相互通訊
本次我們只實現客戶端與伺服器之間連接並通信,暫時沒有寫伺服器的轉發功能。

2 TCP的簡單介紹

2.1 TCP的「三次握手」

TCP的三次握手可以確保伺服器和客戶端之間可以正常通訊。三次握手的過程:至於這個過程的解釋,可以點擊下面的連結來查看。
php能實作socket通訊嗎
參考:https://www.php.cn/link/70203474234c15a59de1eacc053f5690

#2.2 IP和PORT

#伺服器需要有一個有一個需要有一個IP,TCP通訊時,還需要提供一個連接埠號碼。
客服端需要有一個IP,TCP通訊時,也需要提供一個連接埠號碼。

個人理解:IP就是地址,可以理解為一個房子,當你需要建立通信的時候,首先肯定得相互知道這個房子在哪裡才可以吧,要不然我們得信息發送到哪裡呢?
PORT端口,端口號可以理解為這個房子的一個門,我們需要指定一個門,將訊息從這個門裡面傳送進去或從這個門接受訊息。

2.2 用戶端與伺服器簡單通訊的過程

#2.2.1 php部分相關函數

客戶端:

  1. 建立socketsocket_create();
  2. 向伺服器請求連線socket_connect();
  3. #給伺服器發送訊息/接受伺服器訊息socket_wirte(); / socket_read();
  4. 關閉socketsocket_close();

#伺服器:

    」伺服器:
  • 建立socket

    socket_create();
  • #綁定IP和埠號

    socket_bind();
  • 監聽IP和連接埠號碼(0.0.0.0表示任意IP)

    socket_listen();
  • #阻塞等待客服端的連線

    socket_accept();
  • 讀取客戶端的訊息/寫給客戶端寫訊息

    socket_wirte(); / socket_read();
  • 關閉socket

    socket_close();
    2.2.2 簡要通訊過程
伺服器建立socket,並綁定IP和PORT,然後進入監聽狀態等待客服端發起連線。
  • 客戶端建立socket,對指定伺服器IP和PORT進行連線。
  • 伺服器接受客服端發起的連線。
  • 雙方可以互相傳送資料
  • ###雙方關閉socket。 ###
AB#建立socket建立socket,設定允許存取IP和PORT監聽某個(或所有)IP和某個端口,並進入阻塞等待客戶端 #向指定伺服器IP/PORT發起connet#接受客戶端A的connet雙方已經建立連線傳送訊息傳送訊息#通訊結束後A,B同#時關閉socketA# #B#

這就是一個簡要的通訊過程,至於想要循環發送或異常檢測就是一些細節方面的東西了。

3 開始實作

3.1 PHP安裝與環境設定

  1. 安裝PHP 。這裡我是直接安裝了XAMPP,這個軟體自行幫我安裝了PHP。如果是第一次使用php語言,可以直接百度安裝PHP,也可以安裝XAMPP。
  2. 系統環境配置。在運行程式的時候,我是透過cmd進行運行的,所以需要對系統環境變數進行配置。配置過程請參考:連結:PHP環境變數配置
  3. 檢查php指令是否可以執行。完成1、2兩個步驟之後,執行cmd,執行指令php -v ,運行完成後會顯示PHP的版本號碼。 php能實作socket通訊嗎

3.2 用戶端程式

#3.2.1 寫入程式
  1. 新建一個資料夾socket,在該資料夾下新建文字文件並改名為client.php NOTE:我的資料夾建在桌面上
  2. 開啟client.php NOTE:如果你平常沒有php的編輯器,這個時候可以直接用記事本開啟client.php
  3. ##寫入
  4. 程式 NOTE:程式我在這裡直接給出,並給予註釋,大家可以結合2.2通訊流程來理解,如有疑問請留言
  5. <?php
    $PORT = 请输入端口号; //端口号请查看博文:*3.2.2 程序执行*。设置有效端口:
    $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
    $result = socket_connect($client, "122.114.122.174", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule
    if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
        echo "ERROR CONNECT\n"; 
        die();
    } else {
        echo "CONNECTED\n";
    }
    $data = "Hello World\n"; //建立将要发送的消息
    socket_write($client, $data); //将消息发送出去
    socket_close($client); //关闭socket
    ?>
    程式寫完畢,大家可以直接複製過去,或是
  1. 直接下載NOTE:程式直接運作會報錯,我們需要指定一個連接埠號,請繼續看下節,如何執行程式。
3.2.2 程式執行
  1. 取得程式。透過上節,我們已經有一個簡單的客服端程序,下載請點擊
  2. 尋找有效連接埠。因為我們現在沒有伺服器,所以需要藉助別人提供的伺服器位址及連接埠來調試。
    操作步驟: 1.
    點擊這裡開啟網頁 2.頁面的下方找到:122.114.122.174:
    #xxxxx # 3.將xxxxx部分替換到程式中的第二行並儲存
    網頁操作:

    php能實作socket通訊嗎# 程式操作:

    php能實作socket通訊嗎
  3. ##打開cmd
  4. 。若沒有設定PHP的環境變數請查看:3.1 PHP安裝及環境設定
  5. #執行指令
  6. cd desktop/socket。目的是為了到socket資料夾,依照自己資料夾位置填寫相關路徑。
  7. 執行客戶端程式
  8. php client.php。這時候如果報錯PHP Fatal error,請查看點擊查看解決方法
    # 最後,我們可以看到網頁裡面接收到了訊息。 php能實作socket通訊嗎 NOTE:執行程式後,如果不列印​​CONNECTED,等待一段時間,發現返回ERROR CONNET。這是因為我們的
    連接埠號碼過期了(只能使用3分鐘),重新返回網頁刷新並修改到程式中即可
    如無法正確運行,請留言!

3.3 本機伺服器及客服端程式

#如果不想自己敲,請

直接點此下載並跳轉:3.3.3 程式執行。

3.3.1 写程序/服务器
  1. 新建一个文件夹socket(如有,请忽略),在该文件夹下新建文本文档并改名为server.php NOTE:我的文件夹建在桌面上
  2. 打开server.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开server.php
  3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
socket_listen($server); //进入监听
$connection = socket_accept($server); //接受请求并建立连接
$data = socket_read($connection, 1024); //接受数据
echo $data; //打印数据
socket_close($server);//关闭socket
?>
3.3.2 写程序/客户端
  1. 打开文件夹socket(server.php所在文件夹),在该文件夹下新建文本文档并改名为client.php(如有,请打开直接修改程序即可) NOTE:我的文件夹建在桌面上
  2. 打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
  3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$PORT = 12345; //与server端口匹配
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
$result = socket_connect($client, "127.0.0.1", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule/127.0.0.1指本地IP
if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
    echo "ERROR CONNECT\n"; 
    die();
} else {
    echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立将要发送的消息
socket_write($client, $data); //将消息发送出去
socket_close($client); //关闭socket
?>
3.3.3 程序执行
  1. 获取程序。通过上节,我们已经有一个本地客服端程序和一个服务器程序,下载请点击
  2. 打开cmd。如果没有配置PHP的环境变量请查看:3.1
  3. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到server.php所在的文件夹,根据自己文件夹位置填写相应路径。
  4. 执行服务器程序php server.php。我们发现cmd卡住了,这个时候在等待客户端连接进来。这个时候如果报错PHP Fatal error,请查看点击查看解决方法(如果想强制退出进程按下Ctrl+C
    php能實作socket通訊嗎
  5. 再打开一个cmd
  6. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到client.php所在的文件夹,根据自己文件夹位置填写相应路径。
  7. 执行客户端程序php client.php。(如果想强制退出进程按下Ctrl+C
    php能實作socket通訊嗎
    如果服务器没有反应,请按下Ctrl+C结束进程,重新按照顺序(先在一个CMD执行server.php,再在另一个CMD执行client.php)执行程序。如有疑问,请留言。

4 结束

到这里,我们已经实现了基本的socket通信,当然,这个程序是完全不能实际应用的,如果想要实际应用,需要增加很多细节方面的东西,有一个做的比较好的Workerman,大家可以自行搜索。
之后我会更新如何把这个server.php在自己的阿里云服务器上面运行,这样,我们就可以随时连接进去实现客服端的相互通信了。如果有兴趣可以关注等待。

推荐学习:《PHP视频教程

以上是php能實作socket通訊嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn