php 实现socket通信
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 实现非阻塞模式。

$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_server 和 stream_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 是无连接的快速协议。

错误处理非常重要,检查每个 Socket 操作的返回值以避免潜在问题。
if ($socket === false) {
$errorCode = socket_last_error();
$errorMsg = socket_strerror($errorCode);
die("Socket error: $errorMsg");
}
端口冲突可能导致绑定失败,确保端口未被其他程序占用。防火墙设置可能阻止 Socket 通信,检查防火墙规则。
对于长时间运行的服务器,考虑使用 pcntl_fork 或多线程处理客户端请求,避免阻塞主进程。






