php socket实现聊天室
PHP Socket 实现聊天室
服务端代码
创建一个 server.php 文件,用于监听客户端连接并处理消息:

<?php
$host = '0.0.0.0';
$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);
if (in_array($socket, $read)) {
$newClient = socket_accept($socket);
$clients[] = $newClient;
$key = array_search($socket, $read);
unset($read[$key]);
}
foreach ($read as $client) {
$data = socket_read($client, 1024);
if ($data === false) {
$key = array_search($client, $clients);
socket_close($client);
unset($clients[$key]);
continue;
}
$data = trim($data);
if (!empty($data)) {
foreach ($clients as $sendClient) {
if ($sendClient != $socket && $sendClient != $client) {
socket_write($sendClient, $data . "\n");
}
}
}
}
}
socket_close($socket);
?>
客户端代码
创建一个 client.php 文件,用于连接服务器并发送/接收消息:

<?php
$host = '127.0.0.1';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
while (true) {
$message = readline("Enter message: ");
socket_write($socket, $message, strlen($message));
$response = socket_read($socket, 1024);
echo "Received: " . $response . "\n";
}
socket_close($socket);
?>
运行方法
-
启动服务端: 在终端运行
php server.php,服务端将开始监听指定端口。 -
启动多个客户端: 打开多个终端窗口,分别运行
php client.php,每个客户端可以发送和接收消息。
功能说明
- 服务端使用
socket_select实现多客户端连接管理,避免阻塞。 - 客户端通过
socket_read和socket_write与服务端通信。 - 服务端将接收到的消息广播给所有连接的客户端(除了发送者)。
注意事项
- 确保服务器防火墙允许指定端口的通信。
- 此示例为简化版本,实际应用中需添加错误处理和更多功能(如用户昵称、私聊等)。
- 生产环境建议使用更成熟的解决方案(如 WebSocket)替代原生 Socket。






