php实现udp
使用 PHP 的 socket 扩展实现 UDP 通信
PHP 可以通过 socket 扩展实现 UDP 协议的网络通信。UDP 是一种无连接的协议,适用于对实时性要求高但允许少量丢包的场景。
创建 UDP 服务器端
以下代码展示如何创建一个 UDP 服务器,监听指定端口并接收客户端发送的数据:

$serverIp = '0.0.0.0';
$serverPort = 9502;
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, $serverIp, $serverPort);
while (true) {
socket_recvfrom($socket, $buffer, 1024, 0, $clientIp, $clientPort);
echo "Received from $clientIp:$clientPort: $buffer\n";
$response = "Server received: $buffer";
socket_sendto($socket, $response, strlen($response), 0, $clientIp, $clientPort);
}
创建 UDP 客户端
以下代码展示如何创建 UDP 客户端向服务器发送数据并接收响应:
$serverIp = '127.0.0.1';
$serverPort = 9502;
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$message = "Hello UDP Server";
socket_sendto($socket, $message, strlen($message), 0, $serverIp, $serverPort);
socket_recvfrom($socket, $buffer, 1024, 0, $serverIp, $serverPort);
echo "Received from server: $buffer\n";
socket_close($socket);
错误处理
在实际应用中应该添加错误处理:

$socket = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
$error = socket_last_error();
die("Socket create failed: " . socket_strerror($error));
}
if (!@socket_bind($socket, $serverIp, $serverPort)) {
$error = socket_last_error();
die("Socket bind failed: " . socket_strerror($error));
}
使用 stream 函数实现 UDP
PHP 也可以使用 stream 函数实现 UDP 通信:
// UDP 服务器
$server = stream_socket_server("udp://0.0.0.0:9503", $errno, $errstr, STREAM_SERVER_BIND);
if (!$server) {
die("$errstr ($errno)");
}
do {
$data = stream_socket_recvfrom($server, 1024, 0, $peer);
echo "Received from $peer: $data";
stream_socket_sendto($server, "Received: $data", 0, $peer);
} while ($data !== false);
// UDP 客户端
$client = stream_socket_client("udp://127.0.0.1:9503", $errno, $errstr);
if (!$client) {
die("$errstr ($errno)");
}
stream_socket_sendto($client, "Hello Stream UDP", 0);
$response = stream_socket_recvfrom($client, 1024, 0, $server);
echo "Response from server: $response";
性能注意事项
UDP 通信不保证数据包的顺序和可靠性,适合实时性要求高但允许少量丢包的场景。对于需要可靠传输的应用,应该考虑使用 TCP 协议或在应用层实现重传机制。
多客户端通信时,UDP 服务器需要记录客户端地址信息,因为 UDP 是无连接的,每次通信都需要指定目标地址。





