当前位置:首页 > PHP

php 实现socket通信

2026-03-13 12:59:49PHP

PHP 实现 Socket 通信

创建 Socket 服务器端

使用 socket_create 函数创建 Socket,socket_bind 绑定地址和端口,socket_listen 监听连接,socket_accept 接受客户端连接。

$host = '127.0.0.1';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

$client = socket_accept($socket);
$message = "Hello Client!";
socket_write($client, $message, strlen($message));

socket_close($client);
socket_close($socket);

创建 Socket 客户端端

使用 socket_create 创建 Socket,socket_connect 连接到服务器,socket_read 读取服务器发送的数据。

$host = '127.0.0.1';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

$data = socket_read($socket, 1024);
echo "Received from server: " . $data;

socket_close($socket);

处理多客户端连接

使用循环处理多个客户端连接,结合 socket_select 实现非阻塞模式。

php 实现socket通信

$host = '127.0.0.1';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

$clients = [$socket];

while (true) {
    $read = $clients;
    $write = $except = null;
    socket_select($read, $write, $except, 0);

    foreach ($read as $client) {
        if ($client === $socket) {
            $newClient = socket_accept($socket);
            $clients[] = $newClient;
            echo "New client connected.\n";
        } else {
            $data = socket_read($client, 1024);
            if ($data === false) {
                $index = array_search($client, $clients);
                unset($clients[$index]);
                socket_close($client);
                echo "Client disconnected.\n";
            } else {
                echo "Received: " . $data;
                socket_write($client, "Message received.", strlen("Message received."));
            }
        }
    }
}

使用 Stream 函数实现 Socket

PHP 的 Stream 函数提供了更高级的 Socket 操作方式,如 stream_socket_serverstream_socket_accept

$host = '127.0.0.1';
$port = 8080;

$server = stream_socket_server("tcp://$host:$port", $errno, $errstr);
if (!$server) {
    die("Error: $errstr ($errno)");
}

while ($client = stream_socket_accept($server)) {
    fwrite($client, "Hello Client!\n");
    fclose($client);
}

fclose($server);

注意事项

确保服务器和客户端的协议一致,如 TCP 或 UDP。TCP 是面向连接的可靠协议,UDP 是无连接的快速协议。

php 实现socket通信

错误处理非常重要,检查每个 Socket 操作的返回值以避免潜在问题。

if ($socket === false) {
    $errorCode = socket_last_error();
    $errorMsg = socket_strerror($errorCode);
    die("Socket error: $errorMsg");
}

端口冲突可能导致绑定失败,确保端口未被其他程序占用。防火墙设置可能阻止 Socket 通信,检查防火墙规则。

对于长时间运行的服务器,考虑使用 pcntl_fork 或多线程处理客户端请求,避免阻塞主进程。

标签: 通信php
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (f…