這篇文章為大家帶來了關於php socket的相關知識,其中主要介紹了什麼是socket? php socket如何實現客戶端與服務端資料傳輸?有興趣的朋友下面一起來看一下,希望對大家有幫助。
socket介紹
實現網路進程之間的通信,幾乎所有應用程式都是採用socket,socket 是應用層與TCP/IP 協定族通訊的中間抽象層,它是一組介面。在設計模式中,socket 其實是個門面模式,它把複雜的TCP/IP 協定族隱藏在socket 介面後面,對使用者來說,一組簡單的介面就是全部,讓socket 去組織數據,以符合指定的協議
socket 的英文原意是“孔”或“插座”,通常也被稱為“套接字”,用於描述IP 地址和端口,是一個通訊鏈的句柄,可以用來實現不同虛擬機器或不同電腦之間的通訊。
socket 連結的三個程序
服務端監聽:IP 連接埠號碼
客戶端請求:發出向服務端的IP 以及連接埠的連線請求
連結確認:服務端套接字監聽到或說接收到客戶端套接字連線請求,他就會建立一個新的進程,把服務端的套接字描述發給客戶端,以回應客戶端的請求,一旦客戶端確認了此描述,連線就建立好了。兒服務端的套接字繼續處於監聽狀態,繼續接受其他客戶端套接字的連線請求。
#如果需要在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 | #描述 |
---|---|
可順序化的、可靠的、全雙工的、基於連結的位元組流,支援資料傳送流量控制機制。 TCP 協定是基於這種流式套接字。 | |
資料封包的支援(無連線、不可靠、固定最大長度)UDP 協定是基於此封包套接字 | |
可順序化的、可靠的、全雙工的、面向連接的、固定最大長度的資料通信,資料端透過接收每一個資料段來讀取整個封包 | |
讀取原始的網路協議,這種特殊的套接字可用於手動建立任意類型的協議,一般使用這個套接字來實現ICMP 請求 | |
可靠的資料層,但不保證到達順序,一般的作業系統都未實現此功能 |