当前位置: 首页> 最新文章列表> 使用 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。例如: