当前位置:首页 > PHP

php实现socket

2026-02-13 12:08:52PHP

PHP 实现 Socket 通信

创建 Socket 服务器端

在 PHP 中可以使用 socket_create 函数创建一个 Socket 服务器端。以下是一个简单的示例代码:

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

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

echo "Server listening on $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    $message = socket_read($client, 1024);
    echo "Received: $message\n";
    socket_write($client, "Hello Client!");
    socket_close($client);
}

socket_close($socket);
?>

创建 Socket 客户端

客户端可以使用 socket_createsocket_connect 连接到服务器端:

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

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

$message = "Hello Server!";
socket_write($socket, $message, strlen($message));

$response = socket_read($socket, 1024);
echo "Response from server: $response\n";

socket_close($socket);
?>

使用非阻塞模式

如果需要非阻塞模式,可以使用 socket_set_nonblock

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_connect($socket, $host, $port);

while (true) {
    $read = [$socket];
    $write = [$socket];
    $except = null;

    if (socket_select($read, $write, $except, 0) > 0) {
        if (in_array($socket, $read)) {
            $response = socket_read($socket, 1024);
            echo "Received: $response\n";
            break;
        }
    }
}

socket_close($socket);
?>

错误处理

在 Socket 编程中,错误处理非常重要。可以使用 socket_last_errorsocket_strerror 获取错误信息:

<?php
if (socket_bind($socket, $host, $port) === false) {
    $errorCode = socket_last_error();
    $errorMsg = socket_strerror($errorCode);
    die("Bind failed: [$errorCode] $errorMsg\n");
}
?>

多客户端处理

服务器端可以通过循环处理多个客户端连接:

<?php
while (true) {
    $client = socket_accept($socket);
    $pid = pcntl_fork();

    if ($pid == -1) {
        die('Could not fork');
    } elseif ($pid) {
        socket_close($client);
    } else {
        $message = socket_read($client, 1024);
        echo "Received: $message\n";
        socket_write($client, "Hello Client!");
        socket_close($client);
        exit();
    }
}
?>

使用 UDP 协议

如果需要使用 UDP 协议,可以在创建 Socket 时指定 SOCK_DGRAM

php实现socket

<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, $host, $port);

while (true) {
    socket_recvfrom($socket, $buffer, 1024, 0, $clientIp, $clientPort);
    echo "Received from $clientIp:$clientPort: $buffer\n";
    socket_sendto($socket, "Hello UDP Client!", 17, 0, $clientIp, $clientPort);
}
?>

注意事项

  • 确保服务器和客户端使用相同的协议(TCP 或 UDP)。
  • 处理网络延迟和超时情况。
  • 在多线程或多进程环境下注意资源竞争问题。
  • 使用 socket_set_option 可以设置 Socket 选项,如超时时间。

标签: phpsocket
分享给朋友:

相关文章

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php底层实现

php底层实现

PHP底层实现的核心机制 PHP是一种解释型脚本语言,其底层实现涉及多个关键组件协同工作。理解这些机制有助于优化代码性能和深度调试。 Zend引擎架构 Zend引擎是PHP的核心执行器,采用编译器与…