目錄
TCP/IP Connection
首頁 後端開發 php教程 深入淺出講解:php的socket通訊原理

深入淺出講解:php的socket通訊原理

Feb 07, 2017 am 10:30 AM

對TCP/IP、UDP、Socket程式設計這些字你不會很陌生吧?隨著網路技術的發展,這些詞彙充斥著我們的耳朵。那我想問:

1.  什麼是TCP/IP、UDP?

2.  Socket在哪裡呢?

3.  Socket是什麼?

4.  你會使用它們嗎?

什麼是TCP/IP、UDP?

TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是工業標準的協議集,它是為廣域網路(WANs)設計的。

UDP(User Data Protocol,用戶資料報協定)是與TCP相對應的協定。它是屬於TCP/IP協定族中的一種。

這裡有一張圖,顯示了這些協定的關係。

深入淺出講解:php的socket通訊原理

TCP/IP協定族包括運輸層、網路層、連結層。現在你知道TCP/IP與UDP的關係了吧。

Socket在哪裡呢?

在圖1中,我們沒有看到Socket的影子,那麼它到底在哪裡呢?還是用圖來說話,一目了然。

深入淺出講解:php的socket通訊原理

原來Socket在這裡。

Socket是什麼呢?

Socket是應用層與TCP/IP協定族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協定.

你會使用它們嗎?

前人已經為我們做了很多的事了,網路間的通訊也就簡單了許多,但畢竟還是有挺多工作要做的。以前聽到Socket編程,覺得它是比較高深的程式設計知識,但是只要弄清楚Socket編程的工作原理,神秘的面紗也就揭開了。

一個生活中的場景。你要打電話給一個朋友,先撥號,朋友聽到電話鈴聲後提起電話,這時你和你的朋友就建立起了連接,就可以講話了。等交流結束,掛斷電話結束這次交談。 生活中的場景就解釋了這工作原理,也許TCP/IP協議族就是誕生於生活中,這也不一定。

深入淺出講解:php的socket通訊原理

先從伺服器端說起。伺服器端先初始化Socket,然後與連接埠綁定(bind),對連接埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化一個Socket,然後連接伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端發送資料請求,伺服器端接收請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取數據,最後關閉連接,一次互動結束。

socket相關函數:

----------------------------------------- -------------------------------------------------- ---

socket_accept() 接受一個Socket連接

socket_bind() 把socket綁定在一個IP位址和連接埠上

socket_clear_error() 清除socket 的錯誤或最後一個錯誤的socket資源

socket_connect() 開始一個socket連接

socket_create_listen() 在指定連接埠開啟一個socket監聽

socket_create_pair() 產生一對沒有差異的監聽

socket_create_pair() 產生一對沒有區別的socket產生一個socket的資料結構

socket_get_option() 取得socket選項

socket_getpeername() 取得遠端類似主機的ip位址

socket_getsockname() 取得一個本地socketet的ip位址

socket_getsockname() 取得一個本地socketetet的ip位址

socket_getsockname() 取得一個分散到一個socketetet的ip位址

_ /聚合的陣列

socket_iovec_alloc() 這個函數會建立一個能夠發送接收讀取和寫入的iovec資料結構

socket_iovec_delete() 刪除一個已經指派的iovec

socket_iovec_o​​cket_iovec_ff) 的資料傳回釋放一個iovec資源

socket_iovec_set() 設定iovec的資料新值

socket_last_error() 取得目前socket的最後錯誤代碼

socket_listen() 取得目前socket的最後錯誤代碼

socket_listen() 監聽所有指定的資料碼

socket_readv() 讀取從分散/聚合數組過來的資料

socket_recv() 從socket裡結束資料到快取

socket_recvfrom() 接受資料從指定的socket,如果沒有指定的socket,如果沒有指定的情況) 從iovec接受訊息

socket_select() 多路選擇

socket_send() 這個函數將資料送到socket

socket_sendto() 發送訊息到指定位址的socket

socket_sendto() 發送訊息到指定位址的socket

socket_sendto() 發送訊息到指定位址的socket

) socket裡設定為非區塊模式

socket_set_option() 設定socket選項

socket_shutdown() 這個函數允許你關閉讀取、寫入、或指定的socket

socket_strerror() 返回指定的詳細錯誤) 寫入資料到socket快取

socket_writev() 寫入資料到分散/聚合陣列

案例一:socket通訊示範

伺服器端:

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
 
$ip = &#39;127.0.0.1&#39;;
$port = 1935;
 
/*
 +-------------------------------
 *  @socket通信整个过程
 +-------------------------------
 *  @socket_create
 *  @socket_bind
 *  @socket_listen
 *  @socket_accept
 *  @socket_read
 *  @socket_write
 *  @socket_close
 +--------------------------------
 */
 
/*----------------  以下操作都是手册上的  -------------------*/
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
  echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
}
 
if(($ret = socket_bind($sock,$ip,$port)) < 0) {
  echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
}
 
if(($ret = socket_listen($sock,4)) < 0) {
  echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
}
 
$count = 0;
 
do {
  if (($msgsock = socket_accept($sock)) < 0) {
    echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
    break;
  } else {
     
    //发到客户端
    $msg ="测试成功!\n";
    socket_write($msgsock, $msg, strlen($msg));
     
    echo "测试成功了啊\n";
    $buf = socket_read($msgsock,8192);
     
     
    $talkback = "收到的信息:$buf\n";
    echo $talkback;
     
    if(++$count >= 5){
      break;
    };
     
   
  }
  //echo $buf;
  socket_close($msgsock);
 
} while (true);
 
socket_close($sock);
?>
登入後複製

這是socket的服務端程式碼。然後運行cmd,注意是自己的程式存放路徑啊。

沒有反映,對現在服務端的程式已經開始運行,連接埠已經開始監聽了。運行netstat -ano可以查看連接埠情況,我的是1935連接埠深入淺出講解:php的socket通訊原理

看,連接埠已經處於LISTENING狀態了。接下來我們只要執行客戶端程式即可連接上。上碼

<?php
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2 id="TCP-IP-nbsp-Connection">TCP/IP Connection</h2>\n";
 
$port = 1935;
$ip = "127.0.0.1";
 
/*
 +-------------------------------
 *  @socket连接整个过程
 +-------------------------------
 *  @socket_create
 *  @socket_connect
 *  @socket_write
 *  @socket_read
 *  @socket_close
 +--------------------------------
 */
 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
  echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
  echo "OK.\n";
}
 
echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
  echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
  echo "连接OK\n";
}
 
$in = "Ho\r\n";
$in .= "first blood\r\n";
$out = &#39;&#39;;
 
if(!socket_write($socket, $in, strlen($in))) {
  echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
  echo "发送到服务器信息成功!\n";
  echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>";
}
 
while($out = socket_read($socket, 8192)) {
  echo "接收服务器回传信息成功!\n";
  echo "接受的内容为:",$out;
}
 
 
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>
登入後複製

深入淺出講解:php的socket通訊原理

至此客戶端已經連接上服務端了。 深入淺出講解:php的socket通訊原理

案例二:程式碼詳解

// 设置一些基本的变量
$host = "192.168.1.99";
$port = 1234;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");
//绑定Socket到端口
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n");
// 开始监听链接
$result = socket_listen($socket, 3) or die("Could not set up socketlistener\n");
// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept($socket) or die("Could not accept incomingconnection\n");
// 获得客户端的输入
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// 清空输入字符串
$input = trim($input);
//处理客户端输入并返回结果
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
// 关闭sockets
socket_close($spawn);
socket_close($socket);
登入後複製

下面是其每一步驟的詳細說明:

1.第一步是建立兩個變數來保存Socket運行的伺服器的IP位址和連接埠.你可以設定為你自己的伺服器和連接埠(這個連接埠可以是1到65535之間的數字),前提是這個連接埠未被使用.

// 设置两个变量
$host = "192.168.1.99";
$port = 1234;
登入後複製

2.在伺服器端可以使用set_time_out()函數來確保PHP在等待客戶端連接時不會超時.

// 超时时间
set_time_limit(0);
登入後複製

3.在前面的基礎上,現在該使用socket_creat()函數創建一個Socket了—這個函數返回一個Socket句柄,這個句柄將用在以後所有的函數中.

// 创建Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create
socket\n");
登入後複製

// 创建 socket
$socket = socket_create(AF_INET, SOCK_DGRAM, 0) or die("Could not create
socket\n");
登入後複製

第一個參數”AF_INET”用來指定域名;


第二個參數”SOCK_STREM”告訴函數將創建一個什麼類型的Socket(在這個例子中是TCP類型)

因此,如果你想創建一個UDP Socket的話,你可以使用如下的代碼:

// 绑定 socket to 指定地址和端口
$result = socket_bind($socket, $host, $port) or die("Could not bind to
socket\n");
登入後複製

4.一旦創建了一個Socket句柄,下一步就是指定或者綁定它到指定的地址和端口.這可以通過socket_bind()函數來完成.

// 开始监听连接
$result = socket_listen($socket, 3) or die("Could not set up socket
listener\n");
登入後複製

5.當Socket被創建好並綁定到一個端口後,就可以開始監聽外部的連接了.PHP允許你由socket_listen()函數來開始一個監聽,同時你可以指定一個數字(在這個例子中就是第二個參數:3)

//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept($socket) or die("Could not accept incoming
connection\n");
登入後複製

6.到現在,你的伺服器除了等待來自客戶端的連接請求外基本上什麼也沒有做.一旦一個客戶端的連接被收到, socket_accept()函數便開始起作用了,它接收連接請求並調用另一個子Socket來處理客戶端–伺服器間的信息.

// 读取客户端输入
$input = socket_read($spawn, 1024) or die("Could not read input\n");
登入後複製

這個子socket現在就可以被隨後的客戶端–伺服器通訊所用了.

7.當一個連接被建立後,伺服器就會等待客戶端發送一些輸入信息,這寫信息可以由socket_read()函數來獲得,並把它賦值給PHP的$input變量.

// 处理客户端输入并返回数据
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
登入後複製

socker_read的第而個參數用以指定讀入的位元組數,你可以透過它來限制從客戶端取得資料的大小.

注意:socket_read函數會一直讀取殼戶端資料,直到遇見n ,t或者

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

See all articles