php实现socket
PHP 实现 Socket 通信
PHP 可以通过 socket 扩展实现网络通信,包括 TCP 和 UDP 协议。以下是实现 Socket 通信的基本方法。
创建 TCP 服务器
使用 socket_create、socket_bind 和 socket_listen 创建一个 TCP 服务器。
$host = '127.0.0.1';
$port = 8080;
// 创建 Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket 创建失败: " . socket_strerror(socket_last_error()));
}
// 绑定 Socket
if (!socket_bind($socket, $host, $port)) {
die("Socket 绑定失败: " . socket_strerror(socket_last_error()));
}
// 监听 Socket
if (!socket_listen($socket, 5)) {
die("Socket 监听失败: " . socket_strerror(socket_last_error()));
}
echo "服务器已启动,监听 $host:$port\n";
// 接受客户端连接
$client = socket_accept($socket);
if ($client) {
$message = "欢迎连接到服务器!\n";
socket_write($client, $message, strlen($message));
socket_close($client);
}
socket_close($socket);
创建 TCP 客户端
使用 socket_create 和 socket_connect 创建一个 TCP 客户端。
$host = '127.0.0.1';
$port = 8080;
// 创建 Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket 创建失败: " . socket_strerror(socket_last_error()));
}
// 连接到服务器
if (!socket_connect($socket, $host, $port)) {
die("连接失败: " . socket_strerror(socket_last_error()));
}
// 读取服务器发送的消息
$response = socket_read($socket, 1024);
echo "服务器回复: $response\n";
socket_close($socket);
创建 UDP 服务器
UDP 是无连接的协议,使用 socket_recvfrom 接收数据。
$host = '127.0.0.1';
$port = 8080;
// 创建 Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die("Socket 创建失败: " . socket_strerror(socket_last_error()));
}
// 绑定 Socket
if (!socket_bind($socket, $host, $port)) {
die("Socket 绑定失败: " . socket_strerror(socket_last_error()));
}
echo "UDP 服务器已启动,监听 $host:$port\n";
// 接收数据
$buf = '';
$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 1024, 0, $from, $port);
echo "收到来自 $from:$port 的消息: $buf\n";
socket_close($socket);
创建 UDP 客户端
UDP 客户端使用 socket_sendto 发送数据。
$host = '127.0.0.1';
$port = 8080;
// 创建 Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die("Socket 创建失败: " . socket_strerror(socket_last_error()));
}
// 发送数据
$message = "Hello, UDP Server!";
socket_sendto($socket, $message, strlen($message), 0, $host, $port);
socket_close($socket);
错误处理
Socket 操作可能会失败,建议检查每次调用的返回值并使用 socket_last_error 和 socket_strerror 获取错误信息。
if ($socket === false) {
$errorCode = socket_last_error();
$errorMsg = socket_strerror($errorCode);
die("Socket 操作失败: $errorMsg (Code: $errorCode)");
}
注意事项
- 确保 PHP 已安装
socket扩展(通常默认启用)。 - 防火墙或网络配置可能会阻止 Socket 通信,需检查端口是否开放。
- 高并发场景下需使用多线程或异步 IO(如
stream_select)。
以上示例展示了 PHP 中 Socket 的基本用法,适用于简单的网络通信需求。






