Heim >Backend-Entwicklung >PHP-Tutorial >Eine kurze Einführung in das Socket-Kommunikationsprinzip von PHP
für TCP/IP, UDP, Socket Du kennst das Wort Programmieren nicht, oder? Mit der Entwicklung der Netzwerktechnologie dringen diese Worte in unsere Ohren. Ich möchte also fragen:
1. Was ist TCP/IP, UDP?
2. Wo ist Steckdose?
3. SteckdoseWas ist das?
4. Werden Sie sie verwenden?
Was ist TCP/IP, UDP?
TCP/IP(Transmission Control Protocol/Internet Protocol) Das Transmission Control Protocol/Internet Protocol ist ein Industriestandard-Protokollsatz, der für Weitverkehrsnetze (WANs) entwickelt wurde.
UDP (User Data Protocol, User Datagram Protocol) ist das Protokoll, das TCP entspricht. Es ist ein Mitglied der TCP/IP-Protokollfamilie.
Hier ist ein Diagramm, das die Beziehung zwischen diesen Protokollen zeigt.
Die TCP/IP-Protokollsuite umfasst Transportschicht und Netzwerk Schicht, Verbindungsschicht. Jetzt kennen Sie die Beziehung zwischen TCP/IP und UDP.
Wo ist die Steckdose?
In Abbildung 1 sehen wir den Schatten von Socket nicht. Wo ist er also? Lassen wir Bilder für sich sprechen.
Es stellt sich heraus, dass der Sockel hier ist.
Was ist Socket?
Socket ist eine zwischengeschaltete Software-Abstraktionsschicht für die Kommunikation zwischen der Anwendungsschicht und der TCP/IP-Protokollsuite. Es handelt sich um eine Reihe von Schnittstellen. Im Entwurfsmodus ist Socket eigentlich ein Fassadenmodus, der die komplexe TCP/IP-Protokollfamilie hinter der Socket-Schnittstelle verbirgt. Für Benutzer ist alles eine Reihe einfacher Schnittstellen, die es Socket ermöglichen, Daten so zu organisieren, dass sie dem angegebenen Protokoll entsprechen.
Können Sie sie verwenden?
Frühere Generationen haben viel für uns getan und die Kommunikation zwischen Netzwerken ist viel einfacher geworden, aber es gibt immer noch viel zu tun. Als ich zuvor von Socket-Programmierung hörte, dachte ich, es handele sich um relativ fortgeschrittene Programmierkenntnisse, aber solange wir das Funktionsprinzip der Socket-Programmierung verstehen, wird das Rätsel gelöst sein.
Eine Szene aus dem Leben. Wenn Sie einen Freund anrufen möchten, wählen Sie zuerst die Nummer. Wenn der Freund den Klingelton hört, nimmt er den Hörer ab. Zu diesem Zeitpunkt sind Sie und Ihr Freund verbunden und Sie können sprechen. Wenn die Kommunikation beendet ist, legen Sie den Hörer auf, um das Gespräch zu beenden. Szenen aus dem Leben erklären, wie das funktioniert. Vielleicht wurde die TCP/IP-Protokollfamilie im Leben geboren, aber das ist nicht unbedingt der Fall.
Beginnen wir mit der Serverseite. Der Server initialisiert zuerst den Socket, bindet dann an den Port, lauscht auf den Port, ruft „Accept“ zum „Blockieren“ auf und wartet darauf, dass der Client eine Verbindung herstellt. Wenn zu diesem Zeitpunkt ein Client einen Socket initialisiert und dann eine Verbindung zum Server herstellt und die Verbindung erfolgreich ist, wird die Verbindung zwischen dem Client und dem Server hergestellt. Der Client sendet eine Datenanforderung, der Server empfängt die Anforderung und verarbeitet sie, sendet dann die Antwortdaten an den Client, der Client liest die Daten und schließt schließlich die Verbindung und die Interaktion endet.
Sockelbezogene Funktionen:
------------------------------------- --- ------------------ --- -------
socket_accept() akzeptiert eine Socket-Verbindung
socket_bind() bindet den Socket an eine IP-Adresse und einen Port
socket_clear_error() löscht den Socket-Fehler oder den letzten Fehlercode
socket_close() Schließt eine Socket-Ressource
socket_connect() Startet eine Socket-Verbindung
socket_create_listen() Öffnet einen Socket, der den angegebenen Port überwacht
socket_create_pair() Erzeugt ein Paar nicht unterscheidbarer Sockets in einem Array
socket_create() generiert einen Socket, was dem Generieren einer Socket-Datenstruktur entspricht
socket_get_option() ruft die Socket-Optionen ab
socket_getpeername() ruft die IP-Adresse eines entfernten ähnlichen Hosts ab
socket_getsockname() ruft die ab IP der lokalen Socket-Adresse
socket_iovec_add() Fügt einem Scatter-/Aggregate-Array einen neuen Vektor hinzu
socket_iovec_alloc() Diese Funktion erstellt eine iovec-Datenstruktur, die senden, empfangen, lesen und schreiben kann
socket_iovec_delete() Löschen Sie einen bereits zugewiesenen Iovec.
Socket_iovec_fetch() gibt die Daten der angegebenen Iovec-Ressource zurück.
Socket_iovec_free() gibt eine Iovec-Ressource frei.
Socket_iovec_set() legt den neuen Wert der Iovec-Daten fest letzter Fehlercode des aktuellen Sockets
socket_listen() hört auf alle Verbindungen vom angegebenen Socket
socket_read() liest Daten der angegebenen Länge
socket_readv() liest Daten aus dem Scatter/Aggregate-Array
socket_recv() beendet die Daten vom Socket zum Zwischenspeichern
socket_recvfrom() Akzeptiert Daten vom angegebenen 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 angeschlossenen Socket
socket_sendmsg() sendet eine Nachricht an den Socket
socket_sendto() sendet eine Nachricht an den Socket an der angegebenen Adresse
socket_set_block() Den Socket auf Blockmodus setzen
socket_set_nonblock() socket Auf Nichtblockmodus setzen
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 den detaillierten Fehler der angegebenen Fehlernummer zurück
socket_write() schreibt Daten in den Socket-Cache
socket_writev() schreibt Daten in das Scatter/Aggregate-Array
Fall 1: Demonstration der Socket-Kommunikation
Serverseite:
<span><?php //确保在连接客户端时不会超时 set_time_limit(0); $ip = '127.0.0.1'; $port = 1935; /* +------------------------------- * @socket通信整个过程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */ /*---------------- 以下操作都是手册上的 -------------------*/ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } $count = 0; do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { //发到客户端 $msg ="测试成功!\n"; socket_write($msgsock, $msg, strlen($msg)); echo "测试成功了啊\n"; $buf = socket_read($msgsock,8192); $talkback = "收到的信息:$buf\n"; echo $talkback; if(++$count >= 5){ break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?></span>
Dies ist der Servercode des Sockets. Führen Sie dann cmd aus und achten Sie auf den Speicherpfad Ihres eigenen Programms.
Keine Reflexion, das Serverprogramm wurde gestartet und der Port hat mit dem Abhören begonnen. Führen Sie netstat -ano aus, um den Portstatus zu überprüfen.
Sehen Sie, der Port befindet sich bereits im LISTENING-Zustand. Als nächstes müssen wir nur noch das Client-Programm ausführen, um eine Verbindung herzustellen. Code auf
<span><?php error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2>\n"; $port = 1935; $ip = "127.0.0.1"; /* +------------------------------- * @socket连接整个过程 +------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "OK.\n"; } echo "试图连接 '$ip' 端口 '$port'...\n"; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { echo "连接OK\n"; } $in = "Ho\r\n"; $in .= "first blood\r\n"; $out = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?></span>
Der Client ist jetzt verbunden Auf der Serverseite.
Fall 2: Detaillierte Codeerklärung
// Legen Sie einige grundlegende Variablen fest
$host = "192.168.1.99" ;
$port = 1234;
//Timeout festlegen
set_time_limit(0);
//Socket erstellen
$socket = socket_create(AF_INET, SOCK_STREAM, 0) oder sterben („Socketn konnte nicht erstellt werden“ );
//Socket an Port binden
$result = socket_bind($socket, $host, $port ) oder sterben("Konnte keine Verbindung zum Socket herstellen");
// Beginnen Sie mit der Überwachung des Links
$result = socket_listen($socket, 3) oder sterben("Socketlistenern konnte nicht eingerichtet werden");
// Eingehende Verbindungen akzeptieren
// Ein weiterer Socket zur Abwicklung der Kommunikation
$spawn = socket_accept($socket) oder sterben(„Eingehende Verbindung konnte nicht akzeptiert werden“);
// Erhalten Sie Eingaben vom Client
$input = socket_read($spawn , 1024) oder sterben(„Konnte Eingaben nicht lesen“);
// Lösche die Eingabezeichenfolge
$input = trim( $input );
//Client-Eingabe verarbeiten und Ergebnisse zurückgeben
$output = strrev($input) ;socket_write(
$spawn, $output , strlen ($output)) oder sterben("Konnte nicht schreibenoutputn");
// Sockets schließen
socket_close(
$ spawn);socket_close(
$socket);Im Folgenden finden Sie eine detaillierte Beschreibung jedes Schritts:Zum Beispiel:Website-Design-Unternehmen,
Design-Unternehmen ,Internet-Marketing,Internet-Werbung,Internet-Optimierung Website-Werbung, Website-Optimierung, Website-Betrieb usw. Das sind sie alle ähnlichen Schritte. 1. Der erste Schritt besteht darin, zwei Variablen zu erstellen, um die IP-Adresse und den Port des Servers zu speichern, auf dem der Socket ausgeführt wird. Sie können ihn auf Ihr eigenes Website-Design einstellen
Server und Build-Website Port (dieser Port kann eine Zahl zwischen 1 und 65535 sein), sofern dieser Port nicht verwendet wird . [In Zwischenablage kopieren]
PHP-CODE:
<h5>// Zwei Variablen festlegen <span></span>
</h5>$host <p><span>= <code><span>// 设置两个变量<br></span><span>$host </span><span>= </span><span>"192.168.1.99"</span><span>;<br></span><span>$port </span><span>= </span><span>1234</span><span>;</span><br>
"192.168.1.99"
;$port = 1234;
2. Auf der Serverseite können Sie die Funktion set_time_out() verwenden , um sicherzustellen, dass PHP beim Warten auf die Verbindung des Clients nicht abläuft .Erstellen Sie eine Website
<span>// 超时时间<br></span><span>set_time_limit</span><span>(</span><span>0</span><span>);</span><br>
[In Zwischenablage kopieren]PHP-CODE:// Timeout
set_time_limit(0
); 3. Auf der Grundlage von ist es nun an der Zeit, einen Socket mit der Funktion socket_creat() zu erstellen – diese Funktion gibt ein Socket-Handle zurück, das in allen zukünftigen WebsitesIn der Funktion von .[In Zwischenablage kopieren]<code><span>// 创建Socket<br></span><span>$socket </span><span>= </span><span>socket_create</span><span>(</span><span>AF_INET</span><span>, </span><span>SOCK_STREAM</span><span>, </span><span>0</span><span>) or die(</span><span>"Could not create<br>socketn"</span><span>);</span><br>
// Socket erstellen
$socket = socket_create
(AF_INET, SOCK_STREAM,
0) oder sterben("Konnte
);
<span>// 创建 socket<br></span><span>$socket </span><span>= </span><span>socket_create</span><span>(</span><span>AF_INET</span><span>, </span><span>SOCK_DGRAM</span><span>, </span><span>0</span><span>) or die(</span><span>"Could not create<br>socketn"</span><span>);</span><br>
Der zweite Parameter „SOCK_STREM“ teilt der Funktion mit, welche Klasse
(in diesem Beispiel TCP Typ ) Wenn Sie also einen UDP-Socket erstellen möchten, Sie können den folgenden Code verwenden:[In Zwischenablage kopieren]
PHP-CODE :
= <span>// 绑定 socket to 指定地址和端口<br></span><span>$result </span><span>= </span><span>socket_bind</span><span>(</span><span>$socket</span><span>, </span><span>$host</span><span>, </span><span>$port</span><span>) or die(</span><span>"Could not bind to<br>socketn"</span><span>);</span><br>
socket_create
AF_INET, SOCK_DGRAM, 0) oder sterben (
"Socketn konnte nicht erstellt werden");
<span>// 开始监听连接<br></span><span>$result </span><span>= </span><span>socket_listen</span><span>(</span><span>$socket</span><span>, </span><span>3</span><span>) or die(</span><span>"Could not set up socket<br>listenern"</span><span>);</span><br>
Adresse des Website-Bauunternehmens
und Enterprise-Website-Erstellung Port Dies kann über die Funktion socket_bind() erfolgen.
[In Zwischenablage kopieren]PHP CODE:
<span>//接受请求链接<br>// 调用子socket 处理信息<br></span><span>$spawn </span><span>= </span><span>socket_accept</span><span>(</span><span>$socket</span><span>) or die(</span><span>"Could not accept incoming<br>connectionn"</span><span>);</span><br>
$result
socket_bind($socket, $host, $port
) oder sterben("Konnte keine Bindung anSocketn durchführen");5. Nachdem der Socket erstellt und an einen Port gebunden wurde, können Sie mit dem Abhören von externen Connected beginnen. Mit PHP können Sie eine Website-Produktionsfirma
gründen, die über die Funktion socket_listen() abhört, und Sie können eine Zahl angeben ( In diesem Beispiel ist es der zweite Parameter: 3)
PHP CODE: <span>// 读取客户端输入<br></span><span>$input </span><span>= </span><span>socket_read</span><span>(</span><span>$spawn</span><span>, </span><span>1024</span><span>) or die(</span><span>"Could not read inputn"</span><span>);<br>?&</span><span>gt</span><span>;</span><br>
// Beginnen Sie mit der Suche nach Verbindungen $result = socket_listen($socket, 3) oder sterben("Socket konnte nicht eingerichtet werden Listener");
6. Bis jetzt hat Ihr Server im Grunde nur Warten Es wird nichts getan, außer der Verbindungsanfrage vom Client. Sobald eine Client-Verbindung empfangen wird, kommt die Funktion socket_accept() ins Spiel. Sie empfängt die Verbindungsanfrage und ruft einen anderen Sub-Socket auf, um den Client zu bearbeiten – Website-ErstellungInformationen zwischen Servern.[In Zwischenablage kopieren]PHP-CODE://Anforderungslink akzeptieren// Subsocket-Prozessinformationen aufrufen$spawn = socket_accept($socket) oder sterben(„EingehendeVerbindung konnte nicht angenommen werden“);
Dieser Sub-Socket kann nun für die nachfolgende WebseitenproduktionClient-Server-Kommunikation verwendet werden. 7. Wenn eine Verbindung hergestellt ist, Webdesign Der Server wartet darauf, dass der Client einige Eingabeinformationen sendet. Diese Informationen können mit der Funktion socket_read() abgerufen und der $input-Variablen von PHP zugewiesen werden.[In Zwischenablage kopieren]PHP-CODE://Client-Eingabe lesen$input = socket_read( $spawn, 1024) oder sterben("Konnte Eingaben nicht lesen" );? >
Der zweite Parameter von socker_read wird verwendet, um die Anzahl der gelesenen Bytes anzugeben. Sie können ihn verwenden, um die Erfassung von Daten vom Client Größe.
Hinweis: Die Funktion socket_read liest immer die Daten des Shell-Clients APPEntwicklung, bis sie auf n, t oder trifft
Das Obige hat eine kurze Einführung in das Socket-Kommunikationsprinzip von PHP gegeben, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.