欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸

這篇文章主要介紹“PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸”文章能幫助大家解決問(wèn)題。

創(chuàng)新互聯(lián)公司云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬空間、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、虛擬空間、國(guó)際域名空間、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

socket介紹

實(shí)現(xiàn)網(wǎng)絡(luò)進(jìn)程之間的通信,幾乎所有應(yīng)用程序都是采用 socket,socket 是應(yīng)用層與 TCP/IP 協(xié)議族通信的中間抽象層,它是一組接口。在設(shè)計(jì)模式中,socket 其實(shí)是一個(gè)門面模式,它把復(fù)雜的 TCP/IP 協(xié)議族隱藏在 socket 接口后面,對(duì)用戶來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓 socket 去組織數(shù)據(jù),以符合指定的協(xié)議

PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸

socket 的英文原意是 「孔」或「插座」,通常也被稱作「套接字」,用于描述 IP 地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。

socket 鏈接的三個(gè)過(guò)程

  • 服務(wù)端監(jiān)聽:IP+端口號(hào)

  • 客戶端請(qǐng)求:發(fā)出向服務(wù)端的 IP 以及端口的連接請(qǐng)求

  • 鏈接確認(rèn):服務(wù)端套接字監(jiān)聽到或者說(shuō)接收到客戶端套接字連接請(qǐng)求,他就會(huì)建立一個(gè)新的進(jìn)程,把服務(wù)端的套接字描述發(fā)給客戶端,以響應(yīng)客戶端的請(qǐng)求,一旦客戶端確認(rèn)了此描述,連接就建立好了。兒服務(wù)端的套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接受其他客戶端套接字的連接請(qǐng)求。

PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸

php實(shí)現(xiàn)socket

如果需要在 php 中使用 socket,則需要在編譯 php 是添加 --enable-sockets 配置項(xiàng)來(lái)啟用,可使用 php -m|grep sockets 命令檢查啟用情況

快速體驗(yàn)

服務(wù)端與客戶端簡(jiǎn)略代碼如下,運(yùn)行后服務(wù)端會(huì)阻塞等待客戶端連接,客戶端會(huì)在控制臺(tái)要求輸入內(nèi)容,輸入后信息會(huì)在服務(wù)端打印,同時(shí)客戶端顯示轉(zhuǎn)為大寫的內(nèi)容,此示例服務(wù)端與客戶端運(yùn)行在一臺(tái)服務(wù)器

服務(wù)端監(jiān)聽

<?php

// 創(chuàng)建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 設(shè)置 ip 被釋放后立即可使用
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);

// 綁定ip與端口
socket_bind($socket, 0, 8888);

// 開始監(jiān)聽
socket_listen($socket);

while (true) {
    // 接收內(nèi)容
    $conn_sock = socket_accept($socket);
    socket_getpeername($conn_sock, $ip, $port);
    // echo '請(qǐng)求ip: ' . $ip . PHP_EOL . '端口: ' . $port;

    while (true) {
        // 獲取消息內(nèi)容
        $msg = socket_read($conn_sock, 10240);
        // TODO 處理業(yè)務(wù)邏輯

        // 將信息轉(zhuǎn)為大寫并原樣返回客戶端
        socket_write($conn_sock, strtoupper($msg));

        echo $msg;
    }
}

客戶端連接

<?php

// 創(chuàng)建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 連接服務(wù)端
socket_connect($socket, '127.0.0.1', 8888);

while (true) {
    // 讓控制臺(tái)輸入內(nèi)容
    fwrite(STDOUT, '請(qǐng)輸入內(nèi)容:');
    $in = fgets(STDIN);

    // 向服務(wù)端發(fā)送內(nèi)容
    socket_write($socket, $in);

    // 讀取服務(wù)端發(fā)送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}

語(yǔ)法解釋

socket_create

socket_create(int $domain,int $type, int $protocol): resource|false

創(chuàng)建并返回一個(gè)套接字資源,通常也稱作一個(gè)通訊節(jié)點(diǎn)。一個(gè)典型的 socket 由至少 2 個(gè)套接字組成,其中一個(gè)運(yùn)行在客戶端,一個(gè)運(yùn)行在服務(wù)端。

參數(shù):

  • domain 指定當(dāng)前套接字使用什么協(xié)議,可用協(xié)議如下:

    Domain描述
    AF_INETIPv4 網(wǎng)絡(luò)協(xié)議,TCP 與 UDP 都可使用此協(xié)議
    AF_INET6IPv6 網(wǎng)絡(luò)協(xié)議,TCP 與 UDP 都可使用此協(xié)議
    AF_UNIX本地通訊協(xié)議,具有高性能與低成本的 IPC
  • type 用戶指定當(dāng)前套接字使用的類型

    type描述
    SOCK_STREAM可順序化的、可靠的、全雙工的、基于鏈接的字節(jié)流,支持?jǐn)?shù)據(jù)傳送流量控制機(jī)制。TCP 協(xié)議基于這種流式套接字。
    SOCK_DGRAM數(shù)據(jù)報(bào)文的支持(無(wú)連接、不可靠、固定最大長(zhǎng)度)UDP 協(xié)議基于這種報(bào)文套接字
    SOCK_SEQPACKET可順序化的、可靠的、全雙工的、面向連接的、固定最大長(zhǎng)度的數(shù)據(jù)通信,數(shù)據(jù)端通過(guò)接收每一個(gè)數(shù)據(jù)段來(lái)讀取整個(gè)數(shù)據(jù)包
    SOCK_RAW讀取原始的網(wǎng)絡(luò)協(xié)議,這種特殊的套接字可用于手工構(gòu)建任意類型的協(xié)議,一般使用這個(gè)套接字來(lái)實(shí)現(xiàn) ICMP 請(qǐng)求
    SOCK_RDM可靠的數(shù)據(jù)層,但不保證到達(dá)順序,一般的操作系統(tǒng)都未實(shí)現(xiàn)此功能
  • protocol 設(shè)置指定 domain 套接字下的具體協(xié)議,如果所需協(xié)議是 TCP 或者 UDP,可以直接使用常量 SOL_TCPSOL_UDP,這個(gè)參數(shù)的具體值可通過(guò) getprotobyname() 函數(shù)獲取

返回值

socket_create() 正確時(shí)返回一個(gè)套接字資源,失敗時(shí)返回 false??梢哉{(diào)用 socket_last_error() 獲取錯(cuò)誤碼,錯(cuò)誤碼可以通過(guò) socket_strerror(int $err_no) 轉(zhuǎn)換為文字的錯(cuò)誤說(shuō)明。

socket_bind

socket_bind(resource $socket, string $address [, int $port]): bool

綁定一個(gè)地址與端口到套接字

參數(shù):

  • socket 使用 socket_create() 創(chuàng)建的套接字資源

  • address

    如果套接字是 AF_INET 族,那么 address 必須是一個(gè)四點(diǎn)法的 IP 地址,例如 127.0.0.1、0.0.0.0

    如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

  • port (可選)

    該參數(shù)僅用于使用 AF_INET 族時(shí),指定當(dāng)前套接字監(jiān)聽的端口號(hào)

返回值:

綁定成功返回 true,失敗時(shí)則返回 false,同 socket_create ,在綁定失敗時(shí)可以調(diào)用 socket_last_error() 獲取錯(cuò)誤碼,錯(cuò)誤碼可以通過(guò) socket_strerror(int $err_no) 轉(zhuǎn)換為文字的錯(cuò)誤說(shuō)明。

socket_listen

socket_listen(resource $socket [, int $backlog]): bool

在使用 socket_create() 創(chuàng)建套接字并使用 socket_bind() 將其綁定到名稱之后,可能會(huì)告訴它偵聽套接字上的傳入連接。該函數(shù)僅適用于 SOCK_STREAMSOCK_SEQPACKET 類型的套接字。

參數(shù):

  • socket 使用 socket_create() 創(chuàng)建的套接字資源

  • backlog 最大數(shù)量的積壓傳入連接將排隊(duì)等待處理,如果連接請(qǐng)求到達(dá)時(shí)隊(duì)列已滿,則客戶端可能會(huì)收到指示為 ECONNREFUSED 的錯(cuò)誤?;蛘撸绻讓訁f(xié)議支持重傳,則可能會(huì)忽略該請(qǐng)求,以便重試可能會(huì)成功。

返回值:

綁定成功返回 true,失敗時(shí)則返回 false,可以調(diào)用 socket_last_error() 獲取錯(cuò)誤碼,錯(cuò)誤碼可以通過(guò) socket_strerror(int $err_no) 轉(zhuǎn)換為文字的錯(cuò)誤說(shuō)明。

socket_accept

socket_accept(resource $socket): resource|false

當(dāng)有新的客戶端連接時(shí),返回一個(gè)新的 socket 資源以用于與客戶端通信,如有多個(gè)連接排隊(duì),則返回第一個(gè)連接,相反如果沒(méi)有待處理的連接,該函數(shù)會(huì)默認(rèn)阻塞當(dāng)前進(jìn)程,直至新的客戶端連接、斷開

參數(shù):

  • socket 使用 socket_create() 創(chuàng)建的套接字資源

返回值:

成功時(shí)返回一個(gè)新的套接字資源,錯(cuò)誤時(shí)返回 false,可以調(diào)用 socket_last_error() 獲取錯(cuò)誤碼,錯(cuò)誤碼可以通過(guò) socket_strerror(int $err_no) 轉(zhuǎn)換為文字的錯(cuò)誤說(shuō)明。

socket_connect

socket_connect(resource $socket, string $address [, int $port = null]): bool

使用套接字實(shí)例發(fā)起到 address 的連接

參數(shù):

  • socket 該參數(shù)必須是由 socket_create() 創(chuàng)建的 socket 實(shí)例

  • address

    如果套接字是 AF_INET 族,那么 address 必須是一個(gè)四點(diǎn)法的 IP 地址,例如 127.0.0.1 如果支持 IPv6 并且套接字是 AF_INET6,那么 address 也可以是一個(gè)有效的 IPv6 地址(例如 ::1

    如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

返回值:

成功時(shí)返回 true, 或者在失敗時(shí)返回 false

socket_write

socket_write(resource $socket, string $data [, int $length = null]): int|false

傳輸數(shù)據(jù)至指定套接字

參數(shù):

  • socket 使用 socket_create()socket_accept() 創(chuàng)建的套接字資源

  • data 要發(fā)送的內(nèi)容

  • length (可選)

    可以指定發(fā)送套接字的替代字節(jié)長(zhǎng)度。如果這個(gè)長(zhǎng)度大于實(shí)際發(fā)送內(nèi)容的長(zhǎng)度,它將被靜默地截?cái)酁閷?shí)際發(fā)送內(nèi)容的長(zhǎng)度。

返回值:

成功時(shí)返回成功發(fā)送的字節(jié)數(shù),或者在失敗時(shí)返回 false,可以調(diào)用 socket_last_error()socket_strerror(int $err_no) 獲取具體錯(cuò)誤信息

socket_read

socket_read(resource $socket, int $length, int $mode = PHP_BINARY_READ): string|false

從套接字資源內(nèi)讀取數(shù)據(jù)

參數(shù):

  • socket 使用 socket_create()socket_accept() 創(chuàng)建的套接字資源(服務(wù)端為 socket_accept() 客戶端為 socket_create()

  • length 指定最大能夠讀取的字節(jié)數(shù)。否則您可以使用 \r、\n、\0 結(jié)束讀?。ǜ鶕?jù) mode 參數(shù)設(shè)置)

  • mode (可選)

    PHP_BINARY_READ (默認(rèn))- 使用系統(tǒng)的 recv() 函數(shù)。二進(jìn)制安全地讀取數(shù)據(jù)。

    PHP_NORMAL_READ - 讀取到 \n、\r 時(shí)停止。

返回值:

socket_read() 返回一個(gè)字符串,表示接收到的數(shù)據(jù)。如果發(fā)生了錯(cuò)誤(包括遠(yuǎn)程主機(jī)關(guān)閉了連接),則返回 false,可以調(diào)用 socket_last_error()socket_strerror(int $err_no) 獲取具體錯(cuò)誤信息

socket_close

socket_close(resource $socket): void

關(guān)閉并銷毀一個(gè)套接字資源

參數(shù):

  • socket 使用 socket_create()socket_accept() 創(chuàng)建的套接字資源

返回值:

無(wú)

關(guān)于“PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

網(wǎng)頁(yè)標(biāo)題:PHP+Socket如何實(shí)現(xiàn)客戶端與服務(wù)端數(shù)據(jù)傳輸
URL地址:http://aaarwkj.com/article28/gihpjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、企業(yè)建站網(wǎng)站建設(shè)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(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)

商城網(wǎng)站建設(shè)
东京热一精品无码av| 插美女逼免费视频导航| 成人性生交大片免费看中文 | 欧美一区二区大香蕉视频| 国产三级精品在线免费| 91精品国产综合久久麻豆| 亚洲精品一区av在线观看| 夜夜爽精品国产亚洲av成人| 欧美日韩视频在线第一页| 水蜜桃成人在线视频免费观看| 极品白嫩少妇无套内谢| 日韩有码大片最新自拍| 日本经典三级在线视频| 成人国产午夜福利网| 亚洲精品成人久久av| 欧美精品亚洲二区中文乱码| 成人黄色动漫在线播放| 91伊人久热精品午夜福利| 日本a级免费大片网站| 黄色亚洲一区二区三区四区| 最新天堂av资源在线观看| 国产一级无码免费视频| 国产午夜福利片新视觉| 精品国产一区二区三区精品日韩| 偷拍色图一区二区二区| 亚洲欧美国产日韩综合在线| 国产农村妇女一区二区三区| 久久伊人亚洲精品中文字幕| 中文字幕的国产在线播放| 亚洲精品在线观看毛片| 四虎最新在线播放视频| 成人免费视频观看国产| 久久青草精品欧美日韩精品| 亚洲精品色在线网站国产呦| 一区二区高清免费日本| 一区二区少妇黄色三区| 深夜释放自己污在线看| 国产精品黄色片在线观看 | 久久五十路初次拍五十路| 正在播放老肥熟妇露脸| 日韩精品在线播放观看|