服務端代碼server.php
<?php
/**
socket通信整個過程
socket_create //創建一個套接字
socket_bind //給套接字綁定 ip 和端口
socket_listen //監聽套接字上的連接
socket_accept //接受一個socket連接
socket_read //接收客戶端 發送的數據
socket_write //將數據寫到 socket 緩存 向客戶端發送
socket_close //關閉套接字資源
*/
//創建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
/**
* 第一個參數說明:
* AF_UNIX(本機通信)
* AF_INET(TCP/IP – IPv4)
* AF_INET6(TCP/IP – IPv6)
* 第二個參數說明:
* SOCK_STREAM(TCP流)
* SOCK_DGRAM(UDP數據報)
* SOCK_RAW(原始套接字)
* 第三個參數說明:
* 如果第二個參數選擇的是TCP,則傳遞SOL_TCP否則就SOL_UDP
*/
if (!$socket) {
echo 'create socket error' . PHP_EOL;
} else {
echo 'create socket success' . PHP_EOL;
}
//綁定ip和端口 這裏iP寫爲本機 127.0.0.1 | 有時候需要我們爲 0.0.0.0
$addr = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $addr, $port)) {
echo 'bind addr success' . PHP_EOL;
} else {
echo 'bind addr error' . PHP_EOL;
}
//監聽套接字
if (!socket_listen($socket)) {
echo 'listen socket error' . PHP_EOL;
} else {
echo 'listen socket success' . PHP_EOL;
}
//接受客戶端連接
$client = socket_accept($socket);
if (!$client) {
echo 'socket_accept error' . PHP_EOL;
} else {
echo 'socket_accept success' . PHP_EOL;
//接受客戶端返回內容
while (true) {
//第一個參數是客戶端套接字 第二個參數從socket中獲取的數據 第三個參數是設置長度最多爲 len 字節的數據將被接收。
$bytesNum = socket_recv($client, $buffer, 100, 0);
if (!$bytesNum) {
echo "socket_recv failed" . PHP_EOL;
exit(1);
} else {
echo "content from client:" . $buffer . PHP_EOL;
}
}
}
客戶端代碼client.php
<?php
//創建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//連接套接字
if (!socket_connect($socket, '127.0.0.1', 8080)) {
echo 'socket connect error' . PHP_EOL;
exit(1);
} else {
while (true) {
//阻塞進程獲取輸入內容
$data = fgets(STDIN);
//如果用戶輸入quit,那麼退出程序 這裏要去除下空格 因爲回車會造成換行符
if (trim($data) == 'quit') {
socket_close($socket);
break;
}
//發送數據給服務端
socket_write($socket, $data);
}
}