目錄
set_time_limit
PHP CODE:
$
) or die("Could not bind to
) ;" >"Could not read inputn") ;
首頁 後端開發 php教程 淺述php的socket通訊原理

淺述php的socket通訊原理

Aug 08, 2016 am 09:23 AM
echo nbsp quot socket

TCP/IPUDPSocket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞彙充斥著我們的耳朵。那我想問:
1.         為TCP/IPUDP
2.         Socket在哪裡呢?
3.         Socket是什麼?
4.         你會使用它們嗎?
什麼是TCP/IPUDP

         TCP/IPTransmission Control Protocol/Internet Protocol/Internet Protocol) WANs )設計的。          UDP
User Data Protocol,使用者資料封包協定)是與TCP相對應的協定。它是屬於TCP/IP協定族中的一種。         這裡有圖,顯示了這些協定的關係。

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

Socket在哪裡呢?

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

 

原來Socket在這裡。

Socket是什麼呢?

  Socket是應用層與TCP/IP協定族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協定. 你會使用它們嗎?
  前人已經給我們做了很多的事了,網路間的通訊也就簡單了許多,但畢竟還是有挺多工作要做的。以前聽到Socket編程,覺得它是比較高深的程式設計知識,但是只要弄清楚Socket編程的工作原理,神秘的面紗也就揭開了。
  一個生活中的場景。你要打電話給一個朋友,先撥號,朋友聽到電話鈴聲後提起電話,這時你和你的朋友就建立起了連接,就可以講話了。等交流結束,掛斷電話結束這次交談。 生活中的場景就解釋了這工作原理,也許TCP/IP協議族就是誕生於生活中,這也不一定。


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

socket相關函數:
------------------------------------------- -------------------------------------------------- -
socket_accept() 接受一個Socket連接
socket_bind() 把socket綁定在一個IP位址和連接埠上
socket_clear_error() 清除socket的錯誤或最後的錯誤代碼
socket_close() 開始一個開始一個socket的錯誤或一個開始的錯誤代碼
socket_close() 開始一個開始使用一個socket的錯誤)一個socket連線
socket_create_listen() 在指定連接埠開啟一個socket監聽
socket_create_pair() 產生一對沒有區別的socket到一個陣列裡
socket_create() 產生一個socket,相當於一個socket 取得一個陣列裡的資料結構
socket_create() 產生一個socket,產生一個socktion) socket選項
socket_getpeername() 取得遠端類似主機的ip位址
socket_getsockname() 取得本地socket的ip位址
socket_iovec_add() 新增一個新的向量到一個分散/聚合的陣列
socket_iovec_add() 新增一個新的向量到一個分散/聚合的陣列
socket 能夠發送函數讀取和寫入的iovec資料結構
socket_iovec_delete() 刪除一個已指派的iovec
socket_iovec_fetch() 傳回指定的iovec資源的資料
socket_iovec_free() 釋放一個新的資源
,cranove目前socket的最後錯誤代碼
socket_listen() 監聽由指定socket的所有連接
socket_read() 讀取指定長度的資料
socket_readv() 讀取從分散/聚合數組過來的資料
socket_recv() 從資料庫結束到快取
socket_recvfrom() 接受資料從指定的socket,如果沒有指定則預設當前socket
socket_recvmsg() 從iovec裡接受訊息
socket_select() 多路選擇
socket_send() 這個函數發送資料到連接的socket_sendmsg() 傳送訊息到socket
socket_sendto() 傳送訊息到指定位址的socket
socket_set_block() 在socket裡設定為區塊模式
socket_set_nonblock() socket裡設定為非區塊模式
socket_set_nonblock() socket裡設定為非區塊模式
socket_socket裡設定為非區塊模式。 ) 這個函數允許你關閉讀取、寫入、或指定的socket
socket_strerror() 傳回指定錯誤號碼的詳細錯誤
socket_write() 寫資料到socket快取
socket_writev() 寫資料到分散/聚合數組

一:socket通訊示範

伺服器端:

<span><?php
//确保在连接客户端时不会超时
set_time_limit(0);

$ip = '127.0.0.1';
$port = 1935;

/*
 &#43;-------------------------------
 *    @socket通信整个过程
 &#43;-------------------------------
 *    @socket_create
 *    @socket_bind
 *    @socket_listen
 *    @socket_accept
 *    @socket_read
 *    @socket_write
 *    @socket_close
 &#43;--------------------------------
 */

/*----------------    以下操作都是手册上的    -------------------*/
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(&#43;&#43;$count >= 5){
            break;
        };
        
    
    }
    //echo $buf;
    socket_close($msgsock);

} while (true);

socket_close($sock);
?></span>
登入後複製
然後運行cmd,注意是自己的程式存放路徑啊。

 

沒有反映,對現在服務端的程式已經開始運行

沒有反映,對現在服務端的程式已經開始運行,,連接埠已經開始監聽了。運行netstat -ano可以查看連接埠狀況,我的是1935埠

 接下來我們只要執行客戶端程式即可連接上。上碼

<span><?php
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>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 "试图连接 '$ip' 端口 '$port'...\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 = '';

if(!socket_write($socket, $in, strlen($in))) {
    echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color='red'>$in</font> <br>";
}

while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}


echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?></span>
登入後複製

至此客戶端已經連接上服務端了。

案例二:程式碼詳解

// 設定一些基本的變數
$host "192.168.1.99"
"192.168.1.99"
1234;
/ / 設定逾時時間
set_time_limit
(
0);
et_create
(
AF_INET
SOCK_STREAM0) or die("Could not createsocketn");綁定 socket_bind( $socket

$host
$port) or dieo"C 3"C // 開始監聽連結$ result socket_listen($socket3

3
機) 
3?
);// accept incoming connections // 另一個Socket來處理通訊$spawn socket_accept($socket)o)

);

/ / 取得客戶端的輸入
$input socket_read($spawn($spawn

(
$spawn
、 not read inputn"
); // 清空輸入字串$input trim($input
$output 
strrev
(
$input) . "n"
$output
strlen
(
$output)) or die("Could not writeoutputn"); ($spawn
);
socket_close($socket);下面是其每一步驟的詳細說明, 網路行銷,網路推廣,
網路最佳化
網站推廣

網站推廣的步驟。 1.第一步是建立兩個變數來保存Socket運行的伺服器的IP位址和連接埠.你可以設定為你自己的網站設計
伺服器和
建設網站伺服器和建設網站
這個連接埠可以是1到65535之間的數字),前提是這個連接埠未被使用.
[Copy to clipboard]PHP CODE:變項$host "192.168.1.99";$port 2.伺服器端可以使用set_time_out ()函數來確保PHP在等待客戶端連線時不會超時.
建網站建網站 PHP CODE:

// 超時時間

set_time_limit
(

0<span>);使用socket_creat()函數創建一個Socket了—這個函數回傳一個Socket句柄,這個句柄將用在以後所有<br></span><span></span>做網站<span></span><span>的函數中.</span><span><br><h5 id="span-PHP-CODE-span"><span>PHP CODE:</span></h5> <p><span><code><span>// 創建Socket<br></span><span>$socket </span><span>= </span><span>$socket </span><span>= </span><span>SOCK_STREAM</span><span>, </span><span>0</span><span>) or die( </span><span>"Could not create</span>socketn"<span></span>);<span><br></span><span></span><br>

第一個參數」AF_INETSTRTSTRL

第一個參數」AF_INETSTRSTRELed
型的Socket(在這個範例中是TCP型)因此,如果你想創建一個UDP Socket的話,你可以使用如下的程式碼 [Copy to clipboard]
PHP CODE:

// 創建 socket

$
AF_INET

<span>SOCK_DGRAM<br></span>, <span> </span>0<span></span>) or die(<span></span>"Could not create<span>socketn"</span><span>);</span><span></span><span></span>)或是綁定句子<span>);</span><span></span> <span></span><span>網站建設公司<br></span><span>地址和</span><br>企業網站建設

端口.這可以透過socket_bind()函數來完成.這可以透過socket_bind()函數來完成。 PHP CODE:// 綁定 socket to 指定位址和連接埠$result 

$host$port

) or die("Could not bind to
socketn"

);<span><br></span><span></span>);<span></span><span></span><span></span>);<span></span><span></span><span></span><span>了.PHP允許你由socket_listen()函數來開始一個</span><span></span>網站製作公司<span></span><span><br></span>監聽,同時你可以指定一個數字(在這個例子中就是第二個參數:3)<span></span><br>

[Copy to clipboard]<span><br></span><span>PHP CODE:</span><span></span><span></span><span>// 開始監聽連接</span><span> </span><span>$socket</span><span>, </span><span>3</span> <span>) or die(<br></span>"Could not set up socket<span>listenern"</span><br>);

); .一旦一個客戶端的連接被收到,socket_accept()函數便開始起作用了,它接收連接請求並調用另一個子Socket來處理客戶端–

網站製作服務器間的信息.

[Copy to clipboard]<span><br><br>PHP CODE:</span><span></span><span></span>/>刪除要求連結請求/刪除<span></span>= <span></span>socket_accept<span> </span>(<span></span>$socket<span><br>) or die(</span><span>"Could not accept incoming</span>connectionn"<br>的

網頁製作客戶端–伺服器通訊所用了.7.當一個連線被建立後,
輸入訊息,這寫訊息可以由socket_read()函數來取得,並把它賦值給PHP的$input變數.
[Copy to clipboard] // 讀取客戶端輸入$input socket_read

(1$s)

"Could not read inputn") ;
?&

gt<span>;<br></span><span></span><span><p><span><span><span>socker_read的第而個參數用以指定讀入的位元組數,你可以透過它來限制從客戶端取得</span><span>資料</span><span>的大小.</span><br><span>:socket_3etet_戶端<span>APP</span><span>開發</span>資料,直到遇見n,t或者 </span> 以上就介紹了淺述php的socket通訊原理,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。 <br> <span> <span></span></span></span></span></p></span>

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

解決方法:您的組織要求您更改 PIN 碼 解決方法:您的組織要求您更改 PIN 碼 Oct 04, 2023 pm 05:45 PM

「你的組織要求你更改PIN訊息」將顯示在登入畫面上。當在使用基於組織的帳戶設定的電腦上達到PIN過期限制時,就會發生這種情況,在該電腦上,他們可以控制個人設備。但是,如果您使用個人帳戶設定了Windows,則理想情況下不應顯示錯誤訊息。雖然情況並非總是如此。大多數遇到錯誤的使用者使用個人帳戶報告。為什麼我的組織要求我在Windows11上更改我的PIN?可能是您的帳戶與組織相關聯,您的主要方法應該是驗證這一點。聯絡網域管理員會有所幫助!此外,配置錯誤的本機原則設定或不正確的登錄項目也可能導致錯誤。即

Windows 11 上調整視窗邊框設定的方法:變更顏色和大小 Windows 11 上調整視窗邊框設定的方法:變更顏色和大小 Sep 22, 2023 am 11:37 AM

Windows11將清新優雅的設計帶到了最前沿;現代介面可讓您個性化和更改最精細的細節,例如視窗邊框。在本指南中,我們將討論逐步說明,以協助您在Windows作業系統中建立反映您的風格的環境。如何更改視窗邊框設定?按+開啟“設定”應用程式。 WindowsI前往個人化,然後按一下顏色設定。顏色變更視窗邊框設定視窗11「寬度=」643「高度=」500「&gt;找到在標題列和視窗邊框上顯示強調色選項,然後切換它旁邊的開關。若要在「開始」功能表和工作列上顯示主題色,請開啟「在開始」功能表和工作列上顯示主題

如何在 Windows 11 上變更標題列顏色? 如何在 Windows 11 上變更標題列顏色? Sep 14, 2023 pm 03:33 PM

預設情況下,Windows11上的標題列顏色取決於您選擇的深色/淺色主題。但是,您可以將其變更為所需的任何顏色。在本指南中,我們將討論三種方法的逐步說明,以更改它並個性化您的桌面體驗,使其具有視覺吸引力。是否可以更改活動和非活動視窗的標題列顏色?是的,您可以使用「設定」套用變更活動視窗的標題列顏色,也可以使用登錄編輯程式變更非活動視窗的標題列顏色。若要了解這些步驟,請前往下一部分。如何在Windows11中變更標題列的顏色? 1.使用「設定」應用程式按+開啟設定視窗。 WindowsI前往“個人化”,然

OOBELANGUAGE錯誤Windows 11 / 10修復中出現問題的問題 OOBELANGUAGE錯誤Windows 11 / 10修復中出現問題的問題 Jul 16, 2023 pm 03:29 PM

您是否在Windows安裝程式頁面上看到「出現問題」以及「OOBELANGUAGE」語句? Windows的安裝有時會因此類錯誤而停止。 OOBE表示開箱即用的體驗。正如錯誤提示所表示的那樣,這是與OOBE語言選擇相關的問題。沒有什麼好擔心的,你可以透過OOBE螢幕本身的漂亮註冊表編輯來解決這個問題。快速修復–1.點選OOBE應用底部的「重試」按鈕。這將繼續進行該過程,而不會再打嗝。 2.使用電源按鈕強制關閉系統。系統重新啟動後,OOBE應繼續。 3.斷開系統與網際網路的連接。在脫機模式下完成OOBE的所

Windows 11 上啟用或停用工作列縮圖預覽的方法 Windows 11 上啟用或停用工作列縮圖預覽的方法 Sep 15, 2023 pm 03:57 PM

工作列縮圖可能很有趣,但它們也可能分散注意力或煩人。考慮到您將滑鼠懸停在該區域的頻率,您可能無意中關閉了重要視窗幾次。另一個缺點是它使用更多的系統資源,因此,如果您一直在尋找一種提高資源效率的方法,我們將向您展示如何停用它。不過,如果您的硬體規格可以處理它並且您喜歡預覽版,則可以啟用它。如何在Windows11中啟用工作列縮圖預覽? 1.使用「設定」應用程式點擊鍵並點選設定。 Windows按一下系統,然後選擇關於。點選高級系統設定。導航至“進階”選項卡,然後選擇“效能”下的“設定”。在「視覺效果」選

Windows 11 上的顯示縮放比例調整指南 Windows 11 上的顯示縮放比例調整指南 Sep 19, 2023 pm 06:45 PM

在Windows11上的顯示縮放方面,我們都有不同的偏好。有些人喜歡大圖標,有些人喜歡小圖標。但是,我們都同意擁有正確的縮放比例很重要。字體縮放不良或圖像過度縮放可能是工作時真正的生產力殺手,因此您需要知道如何自訂以充分利用系統功能。自訂縮放的優點:對於難以閱讀螢幕上的文字的人來說,這是一個有用的功能。它可以幫助您一次在螢幕上查看更多內容。您可以建立僅適用於某些監視器和應用程式的自訂擴充功能設定檔。可以幫助提高低階硬體的效能。它使您可以更好地控制螢幕上的內容。如何在Windows11

10種在 Windows 11 上調整亮度的方法 10種在 Windows 11 上調整亮度的方法 Dec 18, 2023 pm 02:21 PM

螢幕亮度是使用現代計算設備不可或缺的一部分,尤其是當您長時間注視螢幕時。它可以幫助您減輕眼睛疲勞,提高易讀性,並輕鬆有效地查看內容。但是,根據您的設置,有時很難管理亮度,尤其是在具有新UI更改的Windows11上。如果您在調整亮度時遇到問題,以下是在Windows11上管理亮度的所有方法。如何在Windows11上變更亮度[10種方式解釋]單一顯示器使用者可以使用下列方法在Windows11上調整亮度。這包括使用單一顯示器的桌上型電腦系統以及筆記型電腦。讓我們開始吧。方法1:使用操作中心操作中心是訪問

如何修復Windows伺服器中的啟動錯誤代碼0xc004f069 如何修復Windows伺服器中的啟動錯誤代碼0xc004f069 Jul 22, 2023 am 09:49 AM

Windows上的啟動過程有時會突然轉向顯示包含此錯誤代碼0xc004f069的錯誤訊息。雖然啟動程序已經聯機,但一些運行WindowsServer的舊系統可能會遇到此問題。透過這些初步檢查,如果這些檢查不能幫助您啟動系統,請跳到主要解決方案以解決問題。解決方法–關閉錯誤訊息和啟動視窗。然後,重新啟動電腦。再次從頭開始重試Windows啟動程序。修復1–從終端啟動從cmd終端啟動WindowsServerEdition系統。階段–1檢查Windows伺服器版本您必須檢查您使用的是哪種類型的W

See all articles