當前位置: 首頁> 最新文章列表> 使用socket_accept() 構建內網通訊服務

使用socket_accept() 構建內網通訊服務

M66 2025-06-02

在PHP中, socket_accept()是用於接受客戶端連接的函數,常用在基於socket的網絡通訊程序中。本文將介紹如何利用socket_accept()結合其它socket函數,構建一個簡單的內網通訊服務,實現基本的客戶端與服務端數據交換。

1. 什麼是socket_accept()

socket_accept()用於接受一個socket連接請求。它通常在服務端監聽客戶端連接後,調用此函數等待並接受客戶端連接,返回一個新的socket資源用於與該客戶端進行通信。

2. 內網通訊服務示例

下面的示例代碼展示瞭如何使用socket_accept()創建一個簡單的TCP服務器,監聽內網端口,接受客戶端請求,並返回簡單響應。

 <?php
// 創建TCP Socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$server) {
    die("无法創建socket: " . socket_strerror(socket_last_error()) . "\n");
}

// 綁定IP和端口,內網常用IP示例:192.168.1.100,端口9000
$bindResult = socket_bind($server, '192.168.1.100', 9000);
if (!$bindResult) {
    die("无法綁定socket: " . socket_strerror(socket_last_error($server)) . "\n");
}

// 開始監聽,最大等待連接數為5
socket_listen($server, 5);
echo "服務器已啟動,監聽中...\n";

while (true) {
    // 等待並接受客戶端連接
    $client = socket_accept($server);
    if (!$client) {
        echo "連接接受失敗: " . socket_strerror(socket_last_error($server)) . "\n";
        continue;
    }

    // 讀取客戶端數據,最大讀取1024位元組
    $input = socket_read($client, 1024);
    $input = trim($input);
    echo "收到客戶端數據:{$input}\n";

    // 簡單處理:回复客戶端消息
    $response = "服務器已收到: " . $input . "\n";
    socket_write($client, $response, strlen($response));

    // 關閉與客戶端的連接
    socket_close($client);
}

// 關閉服務器socket(通常代碼不會執行到這裡)
socket_close($server);

3. 運行說明

  • 修改代碼中socket_bind函數里的IP地址為你服務器內網IP。

  • 運行該腳本後,服務器開始監聽9000端口,等待客戶端連接。

  • 客戶端可以通過telnet或自定義socket程序連接服務器IP和端口。

  • 服務端收到客戶端消息後,將返回確認信息。

4. 使用自定義客戶端測試

假設客戶端是一個簡單的PHP腳本:

 <?php
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$client) {
    die("客戶端socket創建失败: " . socket_strerror(socket_last_error()) . "\n");
}

// 連接到服務器(請替換成服務器內網IP)
if (!socket_connect($client, '192.168.1.100', 9000)) {
    die("連接服務器失敗: " . socket_strerror(socket_last_error($client)) . "\n");
}

// 發送數據
$message = "Hello from client";
socket_write($client, $message, strlen($message));

// 讀取服務器回复
$response = socket_read($client, 1024);
echo "服務器回复: " . $response . "\n";

socket_close($client);

運行此客戶端腳本後,服務端會打印收到的消息,客戶端會顯示服務端回复。

5. 域名替換示例

如果程序中需要用到URL,域名部分請替換為m66.net 。例如: