Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie einen einfachen Chatroom -Anwendungsprototyp basierend auf der Funktion PHP Socket_accept ()?

So implementieren Sie einen einfachen Chatroom -Anwendungsprototyp basierend auf der Funktion PHP Socket_accept ()?

M66 2025-06-05

Bei der Webprogrammierung wird PHP normalerweise zur Verarbeitung von HTTP -Anforderungen verwendet. Tatsächlich bietet PHP jedoch auch eine reichhaltige, zugrunde liegende Netzwerkbetriebsfunktionen, einschließlich der Funktionen von Socket_* , mit der TCP -Kommunikationsfunktionen implementiert werden können. In diesem Artikel wird gezeigt, wie Sie einen einfachen Chatroom -Anwendungsprototyp basierend auf der Funktion PHP Socket_accept () erstellen, mit der Sie den Socket -Programmiermechanismus von PHP verstehen können.

1. Grundprinzipien

Der grundlegende Mechanismus eines Chatraums lautet: Der Server hört auf einen Port zu, mehrere Clients stellen über Socket eine Verbindung zum Server her, der Server akzeptiert die Verbindung des Clients (über Socket_accept () ) und überträgt die empfangenen Nachrichten an alle anderen Clients.

2. Servercode

Der Server ist dafür verantwortlich, Sockets zu erstellen, Ports zu verbinden, Verbindungen zu hören und Clientverbindungen in einer Schleife zu akzeptieren und dann Nachrichten zu verarbeiten und weiterzuleiten.

 <?php
$host = '0.0.0.0';
$port = 12345;
$clients = [];

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $host, $port);
socket_listen($server);

echo "Server started on $host:$port\n";

while (true) {
    $read = $clients;
    $read[] = $server;

    $write = $except = null;

    if (socket_select($read, $write, $except, null) < 1) {
        continue;
    }

    if (in_array($server, $read)) {
        $client = socket_accept($server);
        if ($client) {
            socket_getpeername($client, $addr, $port);
            echo "Client connected: {$addr}:{$port}\n";
            $clients[] = $client;
            socket_write($client, "Willkommen im Chatraum!\n");
        }
        unset($read[array_search($server, $read)]);
    }

    foreach ($read as $sock) {
        $data = @socket_read($sock, 2048, PHP_NORMAL_READ);
        if ($data === false) {
            $index = array_search($sock, $clients);
            socket_getpeername($sock, $addr, $port);
            echo "Client disconnected: {$addr}:{$port}\n";
            unset($clients[$index]);
            socket_close($sock);
            continue;
        }

        $data = trim($data);
        if (!empty($data)) {
            socket_getpeername($sock, $addr, $port);
            $message = "[{$addr}:{$port}] erklären: {$data}\n";

            foreach ($clients as $client) {
                if ($client !== $sock) {
                    socket_write($client, $message);
                }
            }

            echo $message;
        }
    }
}

3. Client -Implementierungsmethode

Clients können Telnet verwenden oder Browser verwenden, um sich mit WebSocket -Proxy zu verbinden. Wenn Sie jedoch PHP verwenden möchten, um einen Client zum Senden von Nachrichten zu simulieren, können Sie auch den folgenden Code verwenden:

 <?php
$host = '127.0.0.1';
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

echo socket_read($socket, 2048);

while (true) {
    echo "Bitte geben Sie eine Nachricht ein: ";
    $msg = trim(fgets(STDIN));

    if ($msg === 'exit') {
        break;
    }

    socket_write($socket, $msg . "\n");

    $response = socket_read($socket, 2048);
    echo "Eine Nachricht erhalten: " . $response;
}

socket_close($socket);

4. Praktische Vorschläge und Erweiterungsideen

  1. Mehrprozess-Unterstützung : Sie können PCNTL_FORK () verwenden, um eine Mehrprozess-Unterstützung zu erzielen, um die Blockierung des Hauptprozesses zu vermeiden.

  2. Protokollverwaltung : Fügen Sie jeder Nachricht einen Zeitstempel hinzu, um eine spätere Fehlerbehebung zu erleichtern.

  3. Identität : Das Festlegen eines Spitznamens oder einer ID für jeden Client kann die Benutzererfahrung verbessern.

  4. Front-End-Verbindung : Sie können PHP-Chat-Räume in die Websocket-Weiterleitung in der Webseite integrieren und Middleware ähnlich wie http://m66.net/socket-proxy für Communication Bridge verwenden.

5. Zusammenfassung

Durch PHP -Socket -Funktionen wie Socket_accept () können wir einen grundlegenden Chat -Dienst in der Befehlszeilenumgebung implementieren. Obwohl PHP nicht die Mainstream-Sprache für die Echtzeitkommunikation ist, können seine zugrunde liegenden Funktionen weiterhin verwendet werden, um die TCP-Kommunikationsfunktion zu vervollständigen, die als einführendes Beispiel für das Lernnetzwerk-Programmiermechanismen geeignet ist. Wenn Sie es in einer Produktionsumgebung bereitstellen möchten, wird empfohlen, eine professionellere Nachrichtenwarteschlange und ein asynchrones Server -Framework zu kombinieren, um die Leistung und Stabilität zu verbessern.