簡單來說,服務端創建socket,用戶端連接此socket併發送數據。
- 服務端創建socekt的過程:
socket_create():創建一個socket
socket_bind():綁定一個地址
socket_listen():監聽這個socket
socket_accept():接收socket通信數據
socket_read():讀取通信數據
socket_write():返回給客戶端的數據 - 客戶端連接一個socket服務
socket_create():創建一個socket
socket_connect():連接服務端的socket套接字,使客戶端與服務端建立聯繫
socket_write():向服務端寫入字符串
socket_read():讀取服務端的返回
服務端:
<?php
// 創建服務端的socked套接流,net協議爲IPv4,protocol協議爲TCP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 綁定接收的套接流主機和端口,與客戶端對應
if (socket_bind($socket, '127.0.0.1', 8888) == false) {
echo 'Server bind fail :'.socket_strerror(socket_last_error());
}
// 監聽套接流
if (socket_listen($socket, 4) == false) {
echo 'Server listen fail :'.socket_strerror(socket_last_error());
}
// 讓服務器無現獲取客戶端傳過來的信息
do {
// 接收客戶端傳過來的信息
$accept_resource = socket_accept($socket);
if ($accept_resource !== false) {
// 讀取客戶端傳過來的資源,並轉化爲字符串
$string = socket_read($accept_resource, 1024);
// PHP_EOL PHP的換行預定義常量
echo 'Server receive is :'.$string.PHP_EOL;
if ($string != false) {
$return_client = 'Server receive is :'.$string.PHP_EOL;
// 向 socket_accept 的套接流寫入信息,也就是回饋信息給 socket_bind() 所綁定的主機客戶端
socket_write($accept_resource, $return_client, strlen($return_client));
} else {
echo 'Socket_read is fail';
}
socket_close($accept_resource);
}
} while (true);
socket_close($socket);
客戶端:
<?php
// 創建一個socket套接流
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 設置一個socket鏈接選項,這兩個步驟你可以省略
// 接收套接流的最大超時時間1s,後面是微秒單位超時時間,設置爲零,表示不管它
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));
// 發送套接流的最大超時時間爲6s
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>6, "usec"=>0));
// 連接服務端的套接流,這一步就是使客戶端與服務端的套接流建立聯繫
if (socket_connect($socket, '127.0.0.1', 8888) == false) {
echo 'Connect fail message :'.socket_strerror(socket_last_error());
} else {
$message = 'I love you socket!';
// 向服務端寫入字符串信息
if(socket_write($socket, $message, strlen($message)) == false) {
echo 'Fail to write '.socket_strerror(socket_last_error());
} else {
echo 'Client write success'. PHP_EOL;
// 讀取服務端返回來的套接流信息
while (socket_read($socket, 1024)) {
$callback = socket_read($socket, 1024);
echo 'Server return message is :'.PHP_EOL.$callback;
}
}
}
// 工作完畢,關閉套接流
socket_close($socket);
運行結果: