在PHP中,socket編程是一種底層網絡通信方式,適用於構建自定義的服務端程序。本文將介紹如何使用socket_accept()函數接受客戶端連接,並通過socket_write()函數向客戶端發送響應。
首先,我們需要創建一個socket資源,並綁定到指定的IP地址和端口上,以便監聽客戶端請求。
<?php
// 創建一個TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
// 綁定IP和端口,假设綁定本地IP和端口8080
$bind = socket_bind($socket, "0.0.0.0", 8080);
if ($bind === false) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
綁定成功後,我們調用socket_listen()開始監聽,然後使用socket_accept()阻塞等待客戶端連接。
// 開始監聽,允許最多5個連接排隊
socket_listen($socket, 5);
echo "服務器啟動,等待客戶端連接...\n";
while (true) {
// 阻塞等待客戶端連接
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
echo "客戶端已連接\n";
接收到客戶端連接後,可以通過socket_read()讀取客戶端數據,並用socket_write()向客戶端發送響應。例如,發送一條簡單的歡迎消息。
// 讀取客戶端數據,最多讀取1024位元組
$input = socket_read($clientSocket, 1024);
echo "收到客戶端消息: $input\n";
// 發送響應數據
$response = "歡迎訪問m66.net伺服器!\n";
socket_write($clientSocket, $response, strlen($response));
// 關閉客戶端連接
socket_close($clientSocket);
}
當服務器需要關閉時,調用socket_close()釋放資源。
socket_close($socket);
以上代碼展示了一個簡單的基於PHP socket的服務器示例,重點在於:
使用socket_create()創建socket;
使用socket_bind()綁定IP和端口;
使用socket_listen()開始監聽;
使用socket_accept()阻塞等待客戶端連接;
使用socket_write()向客戶端發送數據響應。
這樣,你就可以通過PHP原生socket編程,搭建起基本的TCP服務端,靈活處理客戶端連接與通信。