涉及到兩部分, client和server, 分如下步驟:php
1,client和server兩邊都先建立,綁定。bash
2,server進行監聽,讀取從client傳過來的信息。服務器
3,client發信息socket
4,server收到來自client信息this
5,server寫信息,發送回去編碼
6,client收到來自server的信息code
代碼:orm
建立兩個文件,一個server.php, 一個client.php,以下:server
server部分資源
<?php /** * Created by PhpStorm. * User: c80k2 * Date: 19-3-28 * Time: 下午5:11 */ //服務端主機 $serverHost = '127.0.0.1'; //服務端端口 $serverPort = 1235; //緩衝區長度(能存放多少個客戶端請求) $serverBackLog = 3; $receiveStrLength = 1024; //建立服務端的socket套接流,net協議爲IPv4,protocol協議爲TCP $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) OR DIE('server create fail:'.socket_strerror(socket_last_error())); //綁定接收的套接流主機和端口 socket_bind($serverSocket, $serverHost, $serverPort) OR DIE('server bind fail:'.socket_strerror(socket_last_error())); //監聽套接流 socket_listen($serverSocket, $serverBackLog) OR DIE('server listen fail:'.socket_strerror(socket_last_error())); echo 'server is listening'; //讓服務器無限獲取客戶端傳過來的信息 do { /*接收客戶端傳過來的信息*/ /*socket_accept的做用就是接受socket_bind()所綁定的主機發過來的套接流*/ $acceptResource = socket_accept($serverSocket) OR DIE('server listen fail:'.socket_strerror(socket_last_error())); /*讀取客戶端傳過來的資源,並轉化爲字符串*/ $receivedStr = socket_read($acceptResource, $receiveStrLength) OR DIE('server listen fail:'.socket_strerror(socket_last_error())); /*socket_read的做用就是讀出socket_accept()的資源並把它轉化爲字符串*/ $returnStr = 'server received string : '.$receivedStr.PHP_EOL; echo $returnStr; /*向socket_accept的套接流寫入信息,也就是回饋信息給socket_bind()所綁定的主機客戶端*/ socket_write($acceptResource, $returnStr, strlen($returnStr)); /*socket_write的做用是向socket_create的套接流寫入信息,或者向socket_accept的套接流寫入信息*/ /*socket_close的做用是關閉socket_create()或者socket_accept()所創建的套接流*/ socket_close($acceptResource); } while (true);
client部分
<?php /** * Created by PhpStorm. * User: c80k2 * Date: 19-3-28 * Time: 下午5:11 */ $receiveTimeOutSec = 10; $sendTimeOutSec = 6; //服務端主機 $serverHost = '127.0.0.1'; //服務端端口 $serverPort = 1235; //緩衝區長度(能存放多少個客戶端請求) $receiveStrLength = 1024; //建立一個socket套接流 $clientSocket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) OR DIE('client create fail:'.socket_strerror(socket_last_error())); /****************設置socket鏈接選項*************/ //接收套接流的最大超時時間1秒,後面是微秒單位超時時間,設置爲零,表示無論它 socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => $receiveTimeOutSec, "usec" => 0)); //發送套接流的最大超時時間爲6秒 socket_set_option($clientSocket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => $sendTimeOutSec, "usec" => 0)); /****************設置socket鏈接選項*************/ //鏈接服務端的套接流,這一步就是使客戶端與服務器端的套接流創建聯繫 socket_connect($clientSocket, $serverHost, $serverPort) OR DIE('client connect fail:'.socket_strerror(socket_last_error())); $toSendMessage = 'this is a test text'; //轉爲GBK編碼,處理亂碼問題,這要看你的編碼狀況而定,每一個人的編碼都不一樣 //$toSendMessage = mb_convert_encoding($toSendMessage,'GBK','UTF-8'); //向服務端寫入字符串信息 socket_write($clientSocket, $toSendMessage, strlen($toSendMessage)) OR DIE('client write fail:'.socket_strerror(socket_last_error())); echo 'client write success'.PHP_EOL; //讀取服務端返回來的套接流信息 while ($returnMessage = socket_read($clientSocket, $receiveStrLength)) { echo 'server return message is:'.PHP_EOL.$returnMessage; } socket_close($clientSocket);//工做完畢,關閉套接流
實驗
打開兩個終端,先讓server跑起來
php5.6 server.php server is listening
再讓client發信息
php5.6 client.php client write success
而後看到server收到信息
server received string : this is a test text
而後看到client收到一樣的回覆信息
server return message is: server received string : this is a test text