php实现socket
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_create 和 socket_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_error 和 socket_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 = 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 选项,如超时时间。







