首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Socket 程式設計入門:打造簡易 TCP 服務端與客戶端

     編輯:PHP 相關知識

前言

Socket 是網絡通信的基礎。PHP 提供 socket_* 系列函數,可構建高效能的 TCP 服務。本文通過一個完整的「回聲服務器」範例,示範如何建立服務端監聽、接受連接、收發數據,以及客戶端連接發送請求的全流程。

服務端實現 SocketServer 類

核心步驟:創建 Socket → 綁定 IP/端口 → 監聽 → 循環接受客戶端 → 讀寫數據。

<?php
/**
 * 簡易 TCP Socket 服務端
 */
class SocketServer {
    private $_port = 9000;
    private $_address = '127.0.0.1';
    private $_clients = [];

    public function __set($name, $val) { $this->$name = $val; }

    private function _showError($msg) { exit($msg); }

    public function start() {
        // 1. 創建 Socket
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($sock === false) $this->_showError("socket_create 失敗: " . socket_strerror(socket_last_error()));

        // 2. 綁定地址
        if (socket_bind($sock, $this->_address, $this->_port) === false)
            $this->_showError("socket_bind 失敗: " . socket_strerror(socket_last_error($sock)));

        // 3. 監聽
        if (socket_listen($sock, 5) === false)
            $this->_showError("socket_listen 失敗: " . socket_strerror(socket_last_error($sock)));

        echo "服務已啟動,監聽 {$this->_address}:{$this->_port} ...\n";

        // 4. 主循環
        while (true) {
            $client = socket_accept($sock);
            if ($client === false) continue;

            $this->_clients[] = $client;
            $count = count($this->_clients);
            echo "新連接 | 當前連接數: {$count}\n";

            // 讀取客戶端數據
            $msg = $this->read($client);
            echo "收到: {$msg}\n";

            // 回覆
            $reply = "Server received: {$msg}\n";
            $this->send($client, $reply);

            // 簡單演示:處理完即關閉(實際項目應維持長連接)
            socket_close($client);
            $this->_clients = array_diff($this->_clients, [$client]);
        }
    }

    public function send($socket, $data) {
        return socket_write($socket, $data, strlen($data));
    }

    public function read($socket, $len = 8192) {
        return socket_read($socket, $len);
    }
}

// 啟動服務
$server = new SocketServer();
$server->start();

客戶端測試腳本

<?php
$host = '127.0.0.1';
$port = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) die("創建失敗\n");

if (socket_connect($socket, $host, $port) === false)
    die("連接失敗: " . socket_strerror(socket_last_error($socket)) . "\n");

$msg = "Hello from PHP Client at " . date('H:i:s') . "\n";
socket_write($socket, $msg, strlen($msg));
echo "已發送: {$msg}";

$reply = socket_read($socket, 8192);
echo "服務端回覆: {$reply}";

socket_close($socket);

關鍵注意事項

  • 必須在 CLI 模式運行:`php server.php`。瀏覽器訪問會導致超時,因為 Web 服務器有執行時間限制。
  • 生產環境需加入:非阻塞 I/O (`socket_set_nonblock`)、多進程/多線程、心跳檢測、優雅關閉信號處理。
  • 錯誤處理:每個 socket 函數調用後檢查返回值,使用 `socket_last_error()` 獲取詳情。

擴展方向

掌握基礎後,可嘗試:

  1. 使用 stream_socket_server 簡化代碼。
  2. 引入 Workerman、Swoole 等高性能框架支撐高併發。
  3. 實現自定義協議(如 JSON-RPC、WebSocket)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved