PHP+Socket系列之實現客戶端與服務端資料傳輸
這篇文章為大家帶來了關於php socket的相關知識,其中主要介紹了什麼是socket? php socket如何實現客戶端與服務端資料傳輸?有興趣的朋友下面一起來看一下,希望對大家有幫助。
socket介紹
實現網路進程之間的通信,幾乎所有應用程式都是採用socket,socket 是應用層與TCP/IP 協定族通訊的中間抽象層,它是一組介面。在設計模式中,socket 其實是個門面模式,它把複雜的TCP/IP 協定族隱藏在socket 介面後面,對使用者來說,一組簡單的介面就是全部,讓socket 去組織數據,以符合指定的協議
socket 的英文原意是“孔”或“插座”,通常也被稱為“套接字”,用於描述IP 地址和端口,是一個通訊鏈的句柄,可以用來實現不同虛擬機器或不同電腦之間的通訊。
socket 連結的三個程序
服務端監聽:IP 連接埠號碼
客戶端請求:發出向服務端的IP 以及連接埠的連線請求
連結確認:服務端套接字監聽到或說接收到客戶端套接字連線請求,他就會建立一個新的進程,把服務端的套接字描述發給客戶端,以回應客戶端的請求,一旦客戶端確認了此描述,連線就建立好了。兒服務端的套接字繼續處於監聽狀態,繼續接受其他客戶端套接字的連線請求。
php實作socket
#如果需要在php 中使用socket,則需要在編譯php 是新增-- enable-sockets
設定項目啟用,可使用php -m|grep sockets
指令檢查啟用情況,具體編譯過程可參考這篇文章
#快速體驗
服務端與客戶端簡略程式碼如下,運行後服務端會阻塞等待客戶端連接,客戶端會在控制台要求輸入內容,輸入後資訊會在服務端列印,同時客戶端顯示轉為大寫的內容,此範例服務端與客戶端運行在一台伺服器:
服務端監聽
<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置 ip 被释放后立即可使用 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true); // 绑定ip与端口 socket_bind($socket, 0, 8888); // 开始监听 socket_listen($socket); while (true) { // 接收内容 $conn_sock = socket_accept($socket); socket_getpeername($conn_sock, $ip, $port); // echo '请求ip: ' . $ip . PHP_EOL . '端口: ' . $port; while (true) { // 获取消息内容 $msg = socket_read($conn_sock, 10240); // TODO 处理业务逻辑 // 将信息转为大写并原样返回客户端 socket_write($conn_sock, strtoupper($msg)); echo $msg; } }
客戶端連線
<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 连接服务端 socket_connect($socket, '127.0.0.1', 8888); while (true) { // 让控制台输入内容 fwrite(STDOUT, '请输入内容:'); $in = fgets(STDIN); // 向服务端发送内容 socket_write($socket, $in); // 读取服务端发送的消息 $msg = socket_read($socket, 10240); echo $msg; }
語法解釋
socket_create
socket_create(int $domain,int $type, int $protocol): resource|false
建立並傳回一個套接字資源,通常也稱為一個通訊節點。一個典型的 socket 由至少 2 個套接字組成,其中一個運行在客戶端,一個運行在服務端。
參數:
domain
指定目前套接字使用什麼協議,可用協議如下:Domain 描述 #AF_INET IPv4 網路協議,TCP 與UDP 都可使用此協定 AF_INET6 IPv6 網路協議,TCP 與UDP 都可使用此協定 AF_UNIX 本機通訊協議,具有高效能與低成本的IPC type
使用者指定目前套接字使用的類型type #描述 ##SOCK_STREAM 可順序化的、可靠的、全雙工的、基於連結的位元組流,支援資料傳送流量控制機制。 TCP 協定是基於這種流式套接字。 SOCK_DGRAM 資料封包的支援(無連線、不可靠、固定最大長度)UDP 協定是基於此封包套接字 SOCK_SEQPACKET 可順序化的、可靠的、全雙工的、面向連接的、固定最大長度的資料通信,資料端透過接收每一個資料段來讀取整個封包 SOCK_RAW 讀取原始的網路協議,這種特殊的套接字可用於手動建立任意類型的協議,一般使用這個套接字來實現ICMP 請求 SOCK_RDM #可靠的資料層,但不保證到達順序,一般的作業系統都未實現此功能 protocol
设置指定 domain 套接字下的具体协议,如果所需协议是 TCP 或者 UDP,可以直接使用常量SOL_TCP
或SOL_UDP
,这个参数的具体值可通过getprotobyname()
函数获取返回值
socket_create()
正确时返回一个套接字资源,失败时返回false
。可以调用socket_last_error()
获取错误码,错误码可以通过socket_strerror(int $err_no)
转换为文字的错误说明。socket_bind
socket_bind(resource $socket, string $address [, int $port]): bool
登入後複製绑定一个地址与端口到套接字
参数:
socket
使用socket_create()
创建的套接字资源address
如果套接字是
AF_INET
族,那么address
必须是一个四点法的 IP 地址,例如127.0.0.1
、0.0.0.0
如果套接字是
AF_UNIX
族,那么address
是 Unix 套接字一部分(例如/tmp/my.sock
)port
(可选)该参数仅用于使用
AF_INET
族时,指定当前套接字监听的端口号
返回值:
绑定成功返回
true
,失败时则返回false
,同socket_create
,在绑定失败时可以调用socket_last_error()
获取错误码,错误码可以通过socket_strerror(int $err_no)
转换为文字的错误说明。socket_listen
socket_listen(resource $socket [, int $backlog]): bool
登入後複製在使用
socket_create()
创建套接字并使用socket_bind()
将其绑定到名称之后,可能会告诉它侦听套接字上的传入连接。该函数仅适用于SOCK_STREAM
或SOCK_SEQPACKET
类型的套接字。参数:
socket
使用socket_create()
创建的套接字资源backlog
最大数量的积压传入连接将排队等待处理,如果连接请求到达时队列已满,则客户端可能会收到指示为ECONNREFUSED
的错误。或者,如果底层协议支持重传,则可能会忽略该请求,以便重试可能会成功。
返回值:
绑定成功返回
true
,失败时则返回false
,可以调用socket_last_error()
获取错误码,错误码可以通过socket_strerror(int $err_no)
转换为文字的错误说明。socket_accept
socket_accept(resource $socket): resource|false
登入後複製当有新的客户端连接时,返回一个新的 socket 资源以用于与客户端通信,如有多个连接排队,则返回第一个连接,相反如果没有待处理的连接,该函数会默认阻塞当前进程,直至新的客户端连接、断开
参数:
socket
使用socket_create()
创建的套接字资源
返回值:
成功时返回一个新的套接字资源,错误时返回
false
,可以调用socket_last_error()
获取错误码,错误码可以通过socket_strerror(int $err_no)
转换为文字的错误说明。socket_connect
socket_connect(resource $socket, string $address [, int $port = null]): bool
登入後複製使用套接字实例发起到
address
的连接参数:
socket
该参数必须是由socket_create()
创建的socket
实例address
如果套接字是
AF_INET
族,那么address
必须是一个四点法的 IP 地址,例如127.0.0.1
如果支持 IPv6 并且套接字是AF_INET6
,那么address
也可以是一个有效的 IPv6 地址(例如::1
)如果套接字是
AF_UNIX
族,那么address
是 Unix 套接字一部分(例如/tmp/my.sock
)
返回值:
成功时返回
true
, 或者在失败时返回false
socket_write
socket_write(resource $socket, string $data [, int $length = null]): int|false
登入後複製传输数据至指定套接字
参数:
socket
使用socket_create()
或socket_accept()
创建的套接字资源data
要发送的内容length
(可选)可以指定发送套接字的替代字节长度。如果这个长度大于实际发送内容的长度,它将被静默地截断为实际发送内容的长度。
返回值:
成功时返回成功发送的字节数,或者在失败时返回
false
,可以调用socket_last_error()
与socket_strerror(int $err_no)
获取具体错误信息socket_read
socket_read(resource $socket, int $length, int $mode = PHP_BINARY_READ): string|false
登入後複製从套接字资源内读取数据
参数:
socket
使用socket_create()
或socket_accept()
创建的套接字资源(服务端为socket_accept()
客户端为socket_create()
)length
指定最大能够读取的字节数。否则您可以使用\r
、\n
、\0
结束读取(根据mode
参数设置)mode
(可选)PHP_BINARY_READ
(默认)- 使用系统的recv()
函数。二进制安全地读取数据。PHP_NORMAL_READ
- 读取到\n
、\r
时停止。
返回值:
socket_read()
返回一个字符串,表示接收到的数据。如果发生了错误(包括远程主机关闭了连接),则返回false
,可以调用socket_last_error()
与socket_strerror(int $err_no)
获取具体错误信息socket_close
socket_close(resource $socket): void
登入後複製关闭并销毁一个套接字资源
参数:
-
socket
使用socket_create()
或socket_accept()
创建的套接字资源
返回值:
无
推荐学习:《PHP视频教程》
以上是PHP+Socket系列之實現客戶端與服務端資料傳輸的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn熱AI工具
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Undress AI Tool
免費脫衣圖片
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
如何修復KB5055523無法在Windows 11中安裝?4 週前 By DDD如何修復KB5055518無法在Windows 10中安裝?4 週前 By DDD<🎜>:種植花園 - 完整的突變指南2 週前 By DDD<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙3 週前 By 尊渡假赌尊渡假赌尊渡假赌如何修復KB5055612無法在Windows 10中安裝?3 週前 By DDD熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM
本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲
在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM
JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、
解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM
靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM
字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元
什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM
PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM
PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM
PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,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