今天學習socket通信的同時,順便整理了下以前初識socket的知識。
現在關於php的socket通信,有些框架已經十分成熟了,比如 swoole 和 workerman,這兩個大家可以學習學習。
行了不說廢話了,現在切回正題,說下今天的東西吧。
Socket連接過程
分為三個步驟:服務器監聽,客戶端請求,連接確認。
(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。
(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求
測試如下:
server.php
<?php //獲取tcp協議號碼。 $tcp = getprotobyname("tcp"); // 建立server端socket ,創建並返回一個套接字,也稱作一個通訊節點。一個典型的網絡連接由 2 個套接字構成,一個運行在客戶端,另一個運行在服務器端。 $socket = socket_create(AF_INET, SOCK_STREAM, $tcp); //綁定要監聽的ip和端口,這里綁定的ip一定要寫局域網ip,寫成127.0.0.1客戶端將無法與服務端建議連接。 socket_bind($socket, '192.168.1.11', 10008); //監聽端口 socket_listen($socket); //初始化一個數據,和客戶端通信 $buffer = "connect"; while (true) { // 接受客戶端請求過來的一個socket連接 $connection = socket_accept($socket); if(!$connection){ echo "connect faild"; }else{ echo "Socket connected\n"; // 向客戶端傳遞一個信息數據 if ($buffer != "") { echo "send data to client\n"; socket_write($connection, $buffer . "\n"); echo "Wrote to socket\n"; } else { echo "no data in the buffer\n" ; } // 從客戶端獲取得的數據 while ($data = @socket_read($connection, 1024, PHP_NORMAL_READ)) { printf("Buffer: " . $data . "\n"); //取得信息給客戶端一個反饋, Thank you client, you data is Received success發給客戶端的回應信息。 socket_write($connection, "Thank you client, you data is Received success\n"); } } //關閉 socket socket_close($connection); printf("Closed the socket\n"); } ?>
client.php
<?php // 建立客戶端的socet連接 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //連接服務器端socket $connection = socket_connect($socket, '192.168.1.11', 10008); //要發送到服務端的信息。 $send_data = "This data will Send to server!"; //客戶端去連接服務端並接受服務端返回的數據,如果返回的數據保護not connect就提示不能連接。 while ($buffer = @socket_read($socket, 1024, PHP_NORMAL_READ)) { if (preg_match("/not connect/",$buffer)) { echo "don`t connect\n"; break; } else { //服務端傳來的信息 echo "Buffer Data: " . $buffer . "\n"; echo "Writing to Socket\n"; // 將客戶的信息寫到通道中,傳給服務器端 if (!socket_write($socket, "$send_data\n")) { echo "Write failed\n"; } //服務器端收到信息后,客戶端接收服務端傳給客戶端的回應信息。 while ($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { echo "sent to server:$send_data\n response from server was:" . $buffer . "\n"; } } } ?>
測試圖片如下: