免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何用PHP編寫Socket程序的方法-創(chuàng)新互聯(lián)

如何用PHP編寫Socket程序的方法?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)公司服務(wù)項目包括德陽網(wǎng)站建設(shè)、德陽網(wǎng)站制作、德陽網(wǎng)頁制作以及德陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,德陽網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到德陽省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

環(huán)境配置

socket 編程需要開啟 php 的 socket 擴展,我用的電腦是 windows,所以這里你只需要打開 php.ini 文件,找到這一行去掉注釋就可以了

extension=sockets

官方文檔

php 的 socket 編程的官方地址為:php socket(https://www.php.net/manual/en/book.sockets.php)

服務(wù)端編程

socket 編程遵循一定的編程步驟,這幾個步驟缺一不可,客戶端和服務(wù)端編程有所區(qū)別,我們首先來看一下服務(wù)端。

如何用PHP編寫Socket程序的方法

創(chuàng)建套接字

套接字屬于系統(tǒng)資源,我們首先調(diào)用 socket_create 方法(參考官方文檔:https://www.php.net/manual/en/function.socket-create.php),調(diào)用如下:

$this->socket_handle = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$this->socket_handle) {
      //創(chuàng)建失敗拋出異常,socket_last_error獲取最后一次socket操作錯誤碼,socket_strerror打印出對應(yīng)錯誤碼所對應(yīng)的可讀性描述
     throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
} else {
          echo "create socket successful\n";
}

第一個參數(shù)指定了,當前套接字是采用 ipv4 還是 ipv6,如果是前者的話,那么傳遞 AF_INET,否則 AF_INET6,當然還有一種類型,就是 AF_UNIX,這個暫時不討論,我們一般選擇 AF_INET(ipv6 不是很普及)。

第二個參數(shù),指定了協(xié)議的類型,一般選擇 TCP 或者是 UDP,TCP 是可靠的流傳輸(生活當中用的最為廣泛,保證了可靠性和安全性),UDP 則不是,這個參數(shù)一般選擇 TCP。

第三個如果你之前選擇了 TCP,那么它就是 SOL_TCP,否則就是 SOL_UDP。

綁定地址和端口號

因為一臺主機可能存在多個 ip 地址,所以你需要指定你的 socket 監(jiān)聽的是哪一個,常用的值為 127.0.0.1,或者是監(jiān)聽所有地址 0.0.0.0,那么這里可能有人不明白了,127.0.0.1 和 0.0.0.0 有啥區(qū)別呢?127.0.0.1 只是一個回環(huán)地址,只能用于本機訪問,說白了就是自己玩自己的,因為這個 ip 不對外部開放,所以有人也就無法訪問這個地址,所以如果你的服務(wù)器地址設(shè)置為 127.0.0.1,別人想要訪問,只能去屎吧。

0.0.0.0 嚴格來說不算是一個 ip 地址,它的意思是本機的所有 IP 地址,都是我的,哈哈。

明白了上面這個,我們來看這個調(diào)用的代碼

if (!socket_bind($this->socket_handle, $this->addr, $this->port)) {
         throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
    } else {
         echo "bind addr successful\n";
 }

是不是很簡單,第一個參數(shù)就是 socket_create 返回的結(jié)果,第二個參數(shù)就是地址了,上面已經(jīng)說過了,第三個參數(shù)是端口號。

監(jiān)聽套接字

經(jīng)過上面的這些步驟,我們只是創(chuàng)建了一個套接字并且給它綁定了端口號和地址,但是系統(tǒng)怎么知道它是監(jiān)聽套接字呢?所以呢,我們的事情還沒有做完,所以我們得告訴它啊,別告訴我你和系統(tǒng)心有靈犀啊!!!

if (!socket_listen($this->socket_handle, $this->back_log)) {
      throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
  } else {
      echo "socket  listen successful\n";
 }

第二個參數(shù)值得說明一哈,請聽我細細道來,對于 linux 系統(tǒng)中的每一個進程而言,系統(tǒng)都維護著待處理套接字的隊列(先進先出,總得講個先來后到吧),上層程序處理業(yè)務(wù)邏輯總得需要時間吧,所以讓你你等著你就等著唄。那么這個隊列的大小設(shè)置為多大呢?它的值就是這第二個參數(shù),那么我是不是可以設(shè)置的很大呢?騷年,你想多了吧?不同的系統(tǒng)這個值有所不同,別說我忽悠你,看下面。

The maximum number passed to the backlog parameter highly depends on the underlying platform. On Linux, it is silently truncated to SOMAXCONN. On win32, if passed SOMAXCONN, the underlying service provider responsible for the socket will set the backlog to a maximum reasonable value. There is no standard provision to find out the actual backlog value on this platform.

你也不必關(guān)心這個值精確的數(shù)據(jù),沒有什么意義。

萬事俱備,只欠東風

經(jīng)過上面的一通操作之后,我們可以開始接受來自客戶端的連接了,這個函數(shù)就更簡單了

$client_socket_handle = socket_accept($this->socket_handle);

這個函數(shù)的返回值也是一個套接字句柄,所以你可以對它進行讀寫操作,在當前的實例程序中,我們做的事情很簡單,簡單到你可以懷疑人生了。

 $client_socket_handle = socket_accept($this->socket_handle);
        if (!$client_socket_handle) {
            echo "socket_accept call failed\n";
            exit(1);
        } else {
            while (true) {
                $bytes_num = socket_recv($client_socket_handle, $buffer, 100, 0);
                if (!$bytes_num) {
                    echo "socket_recv  failed\n";
                    exit(1);
                } else {
                    echo "content from client:" . $buffer . "\n";
                }
            }
        }

讀取套接字

以上面的例子為例,我們使用 socket_recv 讀取來自客戶端的內(nèi)容,這個函數(shù)很簡單,函數(shù)原型如下

socket_recv ( resource $socket , string &$buf , int $len , int $flags ) : int

讀取的內(nèi)容會在第二個參數(shù)返回,第二個參數(shù)傳遞我們想要讀取的字符數(shù),第四個參數(shù)可以直接設(shè)置為 0,該函數(shù)的返回值為實際讀取的字節(jié)數(shù)。

客戶端編程

客戶端相對于服務(wù)端來說,就很簡單了,流程如下

如何用PHP編寫Socket程序的方法

創(chuàng)建套接字前面已經(jīng)講過了,不再詳述,客戶端只需要連接服務(wù)器即可,函數(shù)為 socket_create,我們來看一哈在當前的例子中,我們是如何調(diào)用的。

if (!socket_connect($this->socket_handle, $this->server_addr, $this->server_port)) {
            echo socket_strerror(socket_last_error($this->socket_handle)) . "\n";
            exit(1);
        } else {
            while (true) {
                $data = fgets(STDIN);
                //如果用戶輸入quit,那么退出程序
                if (strcmp($data, "quit") == 0) {
                    break;
                }
                socket_write($this->socket_handle, $data);
            }
        }

該函數(shù)只需要指定服務(wù)器的地址和端口號即可,參數(shù)是不是很簡單

練習(xí)實例

在講解基本函數(shù)調(diào)用的時候,我就把自帶程序的核心部分,復(fù)制出來了,如果要完整的程序,這里是地址(php-socket-base-code:https://gitee.com/obamajs/php-socket-base-code),代碼非常簡單,再次提醒,這些代碼完全是用于給大家講解基本的 socket 變成操作,為大家以后的學(xué)習(xí)打下基礎(chǔ),那么如何使用這個例子程序呢?

進入到命令行,開啟服務(wù)器程序

php TcpServer.php,

打開另外一個命令行界面,

php TcpClient.php,

在客戶端界面,輸入任何文本,再輸入回車,再切換到服務(wù)器界面,您將會看到客戶端輸入的內(nèi)容

在筆者的電腦上操作實例截圖如下:

如何用PHP編寫Socket程序的方法

關(guān)于如何用PHP編寫Socket程序的方法問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道了解更多相關(guān)知識。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:如何用PHP編寫Socket程序的方法-創(chuàng)新互聯(lián)
本文鏈接:http://m.newbst.com/article6/dcipig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊網(wǎng)站策劃做網(wǎng)站服務(wù)器托管微信小程序關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作