欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

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

環(huán)境配置

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

extension=sockets

官方文檔

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

服務(wù)端編程

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

如何用PHP編寫(xiě)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操作錯(cuò)誤碼,socket_strerror打印出對(duì)應(yīng)錯(cuò)誤碼所對(duì)應(yīng)的可讀性描述
     throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
} else {
          echo "create socket successful\n";
}

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

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

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

綁定地址和端口號(hào)

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

0.0.0.0 嚴(yán)格來(lái)說(shuō)不算是一個(gè) ip 地址,它的意思是本機(jī)的所有 IP 地址,都是我的,哈哈。

明白了上面這個(gè),我們來(lái)看這個(gè)調(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";
 }

是不是很簡(jiǎn)單,第一個(gè)參數(shù)就是 socket_create 返回的結(jié)果,第二個(gè)參數(shù)就是地址了,上面已經(jīng)說(shuō)過(guò)了,第三個(gè)參數(shù)是端口號(hào)。

監(jiān)聽(tīng)套接字

經(jīng)過(guò)上面的這些步驟,我們只是創(chuàng)建了一個(gè)套接字并且給它綁定了端口號(hào)和地址,但是系統(tǒng)怎么知道它是監(jiān)聽(tīng)套接字呢?所以呢,我們的事情還沒(méi)有做完,所以我們得告訴它啊,別告訴我你和系統(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";
 }

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

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)心這個(gè)值精確的數(shù)據(jù),沒(méi)有什么意義。

萬(wàn)事俱備,只欠東風(fēng)

經(jīng)過(guò)上面的一通操作之后,我們可以開(kāi)始接受來(lái)自客戶(hù)端的連接了,這個(gè)函數(shù)就更簡(jiǎn)單了

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

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

 $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 讀取來(lái)自客戶(hù)端的內(nèi)容,這個(gè)函數(shù)很簡(jiǎn)單,函數(shù)原型如下

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

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

客戶(hù)端編程

客戶(hù)端相對(duì)于服務(wù)端來(lái)說(shuō),就很簡(jiǎn)單了,流程如下

如何用PHP編寫(xiě)Socket程序的方法

創(chuàng)建套接字前面已經(jīng)講過(guò)了,不再詳述,客戶(hù)端只需要連接服務(wù)器即可,函數(shù)為 socket_create,我們來(lái)看一哈在當(dāng)前的例子中,我們是如何調(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);
                //如果用戶(hù)輸入quit,那么退出程序
                if (strcmp($data, "quit") == 0) {
                    break;
                }
                socket_write($this->socket_handle, $data);
            }
        }

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

練習(xí)實(shí)例

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

進(jìn)入到命令行,開(kāi)啟服務(wù)器程序

php TcpServer.php,

打開(kāi)另外一個(gè)命令行界面,

php TcpClient.php,

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

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

如何用PHP編寫(xiě)Socket程序的方法

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

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

網(wǎng)頁(yè)名稱(chēng):如何用PHP編寫(xiě)Socket程序的方法-創(chuàng)新互聯(lián)
本文鏈接:http://www.chinadenli.net/article6/dcipig.html

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

廣告

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

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