当前位置:首页 > 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实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

vue实现串口通信

vue实现串口通信

Vue 实现串口通信的方法 在 Vue 项目中实现串口通信,通常需要借助浏览器提供的 Web Serial API 或第三方库。以下是几种常见的实现方式: 使用 Web Serial API…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php搜索功能实现的

php搜索功能实现的

PHP 搜索功能实现方法 数据库搜索实现 使用 SQL 的 LIKE 语句进行模糊匹配,适用于小型网站和简单搜索需求。 $searchTerm = $_GET['search']; $query =…