◆ Socket-Grundlagen
php verwendet die Socket-Bibliothek von Berkley, um seine Verbindung herzustellen. Ein Socket ist nichts anderes als eine Datenstruktur. Sie verwenden diese Socket-Datenstruktur, um eine Sitzung zwischen dem Client und dem Server zu starten. Dieser Server hört ständig zu und bereitet sich darauf vor, eine neue Sitzung zu generieren. Wenn ein Client eine Verbindung zum Server herstellt, öffnet er einen Port, auf dem der Server auf eine Sitzung wartet. Zu diesem Zeitpunkt akzeptiert der Server die Verbindungsanforderung des Clients und führt dann einen Zyklus durch. Jetzt kann der Client Informationen an den Server senden, und der Server kann Informationen an den Client senden.
Um einen Socket zu generieren, benötigen Sie drei Variablen: ein Protokoll, einen Socket-Typ und einen öffentlichen Protokolltyp. Beim Generieren eines Sockets stehen drei Protokolle zur Auswahl. Lesen Sie weiter unten, um detaillierte Protokollinhalte zu erhalten.
Die Definition eines öffentlichen Protokolltyps ist ein wesentliches Element für die Verbindung. In der folgenden Tabelle werfen wir einen Blick auf die gängigen Protokolltypen.
Tabelle 1: Protokoll
Name/Konstantenbeschreibung
AF_INET Dies ist das von den meisten Sockets verwendete Protokoll, das TCP oder UDP für die Übertragung verwendet, und die in IPv4 verwendete Adresse
AF_INET6 Ähnlich wie oben, aber Es wird für IPv6-Adressen verwendet
AF_UNIX-Lokalprotokoll, wird auf Unix- und Linux-Systemen verwendet. Es wird normalerweise verwendet, wenn sich Client und Server auf demselben Computer befinden
Tabelle 2: Socket-Typ
Name/Konstante Beschreibung
SOCK_STREAM Dieses Protokoll ist eine sequentielle, zuverlässige, datenvollständige Bytestream-basierte Verbindung. Dies ist der am häufigsten verwendete Socket-Typ. Dieser Socket verwendet TCP für die Übertragung.
SOCK_DGRAM Dieses Protokoll ist ein verbindungsloser Übertragungsaufruf mit fester Länge. Dieses Protokoll ist unzuverlässig und verwendet UDP für seine Verbindungen.
SOCK_SEQPACKET Dieses Protokoll ist eine zuverlässige Zweileitungsverbindung, die Datenpakete fester Länge zur Übertragung sendet. Dieses Paket muss vollständig akzeptiert werden, bevor es gelesen werden kann.
SOCK_RAW Dieser Socket-Typ bietet Einzelnetzwerkzugriff. Dieser Socket-Typ verwendet das öffentliche ICMP-Protokoll. (Ping und Traceroute verwenden dieses Protokoll)
SOCK_RDM Dieser Typ wird selten verwendet und ist auf den meisten Betriebssystemen nicht implementiert. Er wird für die Datenverbindungsschicht bereitgestellt und garantiert nicht die Reihenfolge der Datenpakete
Tabelle 3: Öffentlich Protokoll
Name/Konstante Beschreibung
ICMP Internet Control Message Protocol, wird hauptsächlich auf Gateways und Hosts verwendet, um Netzwerkbedingungen zu überprüfen und Fehlermeldungen zu melden
UDP User Data Message Protocol, es handelt sich um ein unzuverlässiges Übertragungsprotokoll für drahtlose Verbindungen
TCP Transmission Control Protocol, das am häufigsten verwendete zuverlässige öffentliche Protokoll. Es kann sicherstellen, dass das Datenpaket den Empfänger erreichen kann. Wenn während der Übertragung ein Fehler auftritt.
Da Sie nun die drei Elemente zum Generieren eines Sockets kennen, verwenden wir die Funktion socket_create() in PHP, um einen Socket zu generieren. Diese socket_create()-Funktion erfordert drei Parameter: ein Protokoll, einen Socket-Typ und ein öffentliches Protokoll. Die Funktion socket_create() gibt einen Ressourcentyp zurück, der den Socket enthält, wenn sie erfolgreich ist, oder false, wenn sie fehlschlägt.
Resourece socket_create(int PRotocol, int socketType, int commonProtocol);
Jetzt generieren Sie einen Socket, was dann? PHP bietet mehrere Funktionen zur Manipulation von Sockets. Sie können einen Socket an eine IP binden, die Kommunikation eines Sockets abhören und einen Socket akzeptieren. Schauen wir uns nun ein Beispiel an, um zu verstehen, wie die Funktion einen Socket generiert, akzeptiert und abhört.
$commonProtocol = getprotobyname("tcp");//Verwenden Sie den öffentlichen Protokollnamen, um einen Protokolltyp zu erhalten
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);// Generieren Sie einen Socket und geben Sie eine Instanz einer Socket-Ressource zurück
socket_bind($socket, 'localhost', 1337);//Binden Sie den Socket an den lokalen Computer
socket_listen($socket);//Alle eingehenden Nachrichten abhören Socket-Verbindungen
// Weitere Socket-Funktionalität folgen
?>
Das obige Beispiel generiert Ihre eigene Serverseite. Die erste Zeile des Beispiels:
$commonProtocol = getprotobyname("tcp");
Verwenden Sie den öffentlichen Protokollnamen, um einen Protokolltyp abzurufen. Hier wird das öffentliche TCP-Protokoll verwendet. Wenn Sie das UDP- oder ICMP-Protokoll verwenden möchten, sollten Sie die Parameter der Funktion getprotobyname() auf „udp“ oder „icmp“ ändern. Eine andere Alternative besteht darin, SOL_TCP oder SOL_UDP in der Funktion socket_create() anzugeben, anstatt die Funktion getprotobyname() zu verwenden.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
Die zweite Zeile des Beispiels generiert einen Socket und gibt eine Instanz der Socket-Ressource zurück. Nachdem Sie über eine Instanz der Socket-Ressource verfügen, müssen Sie den Socket an eine IP-Adresse und einen Port binden.
socket_bind($socket, ‘localhost’, 1337);
Hier binden Sie den Socket an den lokalen Computer (127.0.0.1) und binden den Socket an Ihren 1337-Port. Dann müssen Sie auf alle eingehenden Socket-Verbindungen warten.
socket_listen($socket);
Nach der vierten Zeile müssen Sie alle Socket-Funktionen und deren Verwendung verstehen.
Tabelle 4: Socket-Funktion
Funktionsname Beschreibung
socket_accept() Akzeptiere eine Socket-Verbindung
socket_bind() Binde den Socket an eine IP-Adresse und einen Port
socket_clear_error() Lösche den Socket-Fehler oder den letzten Fehlercode
socket_close() Schließe eine Socket-Ressource
socket_connect () Starten Sie eine Socket-Verbindung.
socket_create_listen() Öffnen Sie einen Socket, um den angegebenen Port abzuhören.
socket_create_pair() Erzeugen Sie ein Paar nicht unterscheidbarer Sockets in einem Array.
socket_create() Erzeugen Sie einen Socket. Generieren Sie einen Socket Datenstruktur
socket_get_option() Abrufen der Socket-Option
socket_getpeername() Abrufen der IP-Adresse eines entfernten ähnlichen Hosts
socket_getsockname() Abrufen der IP-Adresse des lokalen Sockets
socket_iovec_add() Hinzufügen eines neuen Vektor zu einem verstreuten/aggregierten Array
socket_iovec_alloc() Diese Funktion erstellt eine iovec-Datenstruktur, die senden, empfangen, lesen und schreiben kann
socket_iovec_delete() Löscht einen zugewiesenen iovec
socket_iovec_fetch() Gibt die angegebene iovec-Ressource zurück data
socket_iovec_free() Gibt eine iovec-Ressource frei
socket_iovec_set() Setzt den neuen Wert von iovec data
socket_last_error() Ruft den letzten Fehlercode des aktuellen Sockets ab
socket_listen() Hört alle Nachrichten von der angegebene Socket Connect
socket_read() Daten der angegebenen Länge lesen
socket_readv() Daten aus dem verstreuten/aggregierten Array lesen
socket_recv() Daten vom Socket in den Cache beenden
socket_recvfrom() Daten aus dem annehmen angegebener Socket, wenn nicht angegeben, wird der aktuelle Socket als Standard verwendet
socket_recvmsg() Nachrichten von iovec empfangen
socket_select() Mehrfachauswahl
socket_send() Diese Funktion sendet Daten an den verbundenen Socket
socket_sendmsg( ) Eine Nachricht an den Socket senden
socket_sendto() Eine Nachricht an den Socket an der angegebenen Adresse senden
socket_set_block() Den Socket in den Blockmodus versetzen
socket_set_nonblock() Den Socket in den Nicht-Blockmodus versetzen
socket_set_option () Socket-Optionen festlegen
socket_shutdown() Mit dieser Funktion können Sie das Lesen, Schreiben oder den angegebenen Socket schließen
socket_strerror() Gibt einen detaillierten Fehler mit der angegebenen Fehlernummer zurück
socket_write() Daten schreiben in den Socket-Cache
socket_writev() Daten in verstreute/aggregierte Arrays schreiben
Alle oben genannten Funktionen beziehen sich auf Sockets in PHP. Wenn Sie diesen nicht geöffnet haben, müssen Sie ihn bearbeiten Entfernen Sie in Ihrer php.ini-Datei den Kommentar vor der folgenden Zeile:
extension=php_sockets.dll
Wenn Sie den Kommentar nicht entfernen können, verwenden Sie bitte den folgenden Code, um die Erweiterungsbibliothek zu laden:
< ;?php
if( !extension_loaded('sockets')) {
if(strtoupper(substr(PHP_OS, 3)) == "WIN") {
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}
?>
Wenn Sie nicht wissen, ob Ihr Socket offen ist, können Sie dies tun Verwenden Sie die Funktion phpinfo(), um festzustellen, ob der Socket geöffnet ist. Sie können überprüfen, ob der Socket geöffnet ist, indem Sie die PHPInfo-Informationen überprüfen.
Informationen von phpinfo() zum Socket anzeigen
◆ Einen Server generieren
Jetzt werden wir das erste Beispiel verbessern. Sie müssen einen bestimmten Socket abhören und Benutzerverbindungen verarbeiten.
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337) ;
socket_listen($socket);
// Alle eingehenden Verbindungen zum Server akzeptieren
$connection = socket_accept($socket);
if($connection){
socket_write($connection , „Sie haben eine Verbindung zum Socket hergestellt...nr“);
}
?>
Sie sollten Ihre Eingabeaufforderung verwenden, um dieses Beispiel auszuführen. Der Grund dafür ist, dass hier ein Server und keine Webseite generiert wird. Wenn Sie versuchen, dieses Skript mit einem Webbrowser auszuführen, besteht eine gute Chance, dass die 30-Sekunden-Grenze überschritten wird. Sie können den folgenden Code verwenden, um eine unendliche Laufzeit festzulegen. Es wird jedoch empfohlen, zum Ausführen die Eingabeaufforderung zu verwenden.
set_time_limit(0);
Ein einfacher Test dieses Skripts in Ihrer Eingabeaufforderung:
Php.exe example01_server.php
Wenn Sie den PHP-Interpreter nicht im Pfad der Umgebungsvariablen Ihres Systems festgelegt haben, dann Sie müssen den detaillierten Pfad zu php.exe angeben. Wenn Sie den Server ausführen, können Sie ihn testen, indem Sie über Telnet eine Verbindung zu Port 1337 herstellen.
Es gibt drei Probleme mit der Serverseite oben: 1. Sie kann nicht mehrere Verbindungen akzeptieren. 2. Es wird nur ein Befehl ausgeführt. 3. Sie können keine Verbindung zu diesem Server über einen Webbrowser herstellen.
Dieses erste Problem ist einfacher zu lösen: Sie können jedes Mal eine Anwendung verwenden, um eine Verbindung zum Server herzustellen. Das nächste Problem besteht jedoch darin, dass Sie eine Webseite verwenden müssen, um eine Verbindung zum Server herzustellen, was schwieriger ist. Sie können Ihren Server veranlassen, die Verbindung anzunehmen, einige Daten an den Client zu schreiben (falls er diese schreiben muss), die Verbindung schließen und auf die nächste Verbindung warten.
Verbessern Sie den vorherigen Code und generieren Sie den folgenden Code, um Ihren neuen Server zu erstellen:
// Richten Sie unseren Socket ein
$commonProtocol = getprotobyname(" tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337); //socket_bind() Binden Sie den Socket an eine IP-Adresse und einen Port an
socket_listen($ socket);
// Initialisiere den Puffer
$buffer = "NO DATA";
while(true) {
// Akzeptiere alle auf diesem Socket eingehenden Verbindungen
$connection = socket_accept ($socket);//socket_accept() Eine Socket-Verbindung akzeptieren
printf("Socket connectedrn");
// Prüfen, ob sich etwas im Puffer befindet
if($buffer != " "){
printf("Etwas ist im Puffer...sendet Daten...rn");
socket_write($connection, $buffer . "rn"); / /socket_write() Daten schreiben in der Socket-Cache
printf("Wrote to socketrn");
}else {
printf("No Data in the bufferrn");
}
// Holen Sie sich die Eingabe
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))//socket_read() Daten der angegebenen Länge lesen
{
$buffer = $data;
socket_write( $connection, "Information Receivedrn" );
printf("Buffer: " . $buffer . "rn");
}
socket_close($connection); //socket_close() Eine Socket-Ressource schließen
printf("Schließt die socketrnrn");
}
?>
Was soll dieser Server tun? Es initialisiert einen Socket und öffnet einen Cache zum Senden und Empfangen von Daten. Es wartet auf eine Verbindung und sobald eine Verbindung hergestellt ist, wird auf dem Bildschirm auf der Serverseite „Socket verbunden“ angezeigt. Dieser Server überprüft den Puffer und sendet die Daten an den angeschlossenen Computer, wenn sich Daten im Puffer befinden. Dann sendet es eine Annahmenachricht für diese Daten. Sobald es die Nachricht akzeptiert, speichert es die Nachricht in den Daten, macht den angeschlossenen Computer auf die Nachricht aufmerksam und schließt schließlich die Verbindung. Wenn die Verbindung geschlossen wird, beginnt der Server mit der Verarbeitung der nächsten Verbindung.
◆ Es ist einfach, einen Kunden
zu finden, der das zweite Problem löst. Sie müssen eine PHP-Seite erstellen, eine Verbindung zu einem Socket herstellen, einige Daten an den Cache senden und diese verarbeiten. Dann warten die verarbeiteten Daten auf Sie und Sie können Ihre Daten an den Server senden. Bei einer anderen Clientverbindung werden diese Daten verarbeitet.
Das folgende Beispiel zeigt die Verwendung von Socket:
// Erstellen Sie den Socket und verbinden Sie ihn
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect ($socket,'localhost', 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {
if($buffer == „NO DATA“) {
echo ( "
NO DATA
");Buffer Daten: " . $buffer . "
");Writing to Socket
");Write failed
“);Gesendete Daten waren: EINIGE DATEN
Antwort war:“ . $buffer . „
Read from Socket
“); Das Obige ist der grundlegende Inhalt von PHP Socket. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!