Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des PHP-Socket-Kommunikationsfalls

Detaillierte Erläuterung des PHP-Socket-Kommunikationsfalls

墨辰丷
墨辰丷Original
2018-06-07 16:31:371361Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung von Socket-Kommunikationsfällen in PHP vor. Ich hoffe, dass er für alle hilfreich ist.

Kennen Sie die Wörter TCP/IP, UDP und Socket-Programmierung? Mit der Entwicklung der Netzwerktechnologie dringen diese Worte in unsere Ohren.

Was sind also TCP/IP und UDP?
TCP/IP (Transmission Control Protocol/Internet Protocol) ist ein industrieller Standardprotokollsatz, der für Weitverkehrsnetze (WANs) entwickelt wurde.
UDP (User Data Protocol) ist ein Protokoll, das TCP entspricht. Es ist Mitglied der TCP/IP-Protokollsuite.
Hier ist ein Diagramm, das die Beziehung zwischen diesen Protokollen zeigt.

Die TCP/IP-Protokollsuite umfasst die Transportschicht, die Netzwerkschicht und die 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. Warten Sie, bis die Kommunikation beendet ist, legen Sie den Hörer auf und beenden Sie das Gespräch. 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 (verbinden), wird bei erfolgreicher Verbindung 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() Setzen Sie den Socket auf den Blockmodus
socket_set_nonblock() socket Auf den nicht blockierenden Modus einstellen
socket_set_option() Setzen Sie Socket-Optionen
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

serverseitig :

 1 <?php 2 //确保在连接客户端时不会超时 3 set_time_limit(0); 4 5 $ip = &#39;127.0.0.1&#39;; 6 $port = 1935; 7 8 /* 9 +------------------------------- 10 *  @socket通信整个过程 11 +------------------------------- 12 *  @socket_create 13 *  @socket_bind 14 *  @socket_listen 15 *  @socket_accept 16 *  @socket_read 17 *  @socket_write 18 *  @socket_close 19 +-------------------------------- 20 */ 21 22 /*----------------  以下操作都是手册上的  -------------------*/ 23 if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { 24 echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; 25 } 26 27 if(($ret = socket_bind($sock,$ip,$port)) < 0) { 28 echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; 29 } 30 31 if(($ret = socket_listen($sock,4)) < 0) { 32 echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; 33 } 34 35 $count = 0; 36 37 do { 38 if (($msgsock = socket_accept($sock)) < 0) { 39 echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; 40 break; 41 } else { 42 43 //发到客户端 44 $msg ="测试成功!\n"; 45 socket_write($msgsock, $msg, strlen($msg)); 46 47 echo "测试成功了啊\n"; 48 $buf = socket_read($msgsock,8192); 49 50 51 $talkback = "收到的信息:$buf\n"; 52 echo $talkback; 53 54 if(++$count >= 5){ 55 break; 56 }; 57 58 59 } 60 //echo $buf; 61 socket_close($msgsock); 62 63 } while (true); 64 65 socket_close($sock); 66 ?>

Dies ist der Servercode des Sockets. Führen Sie dann cmd aus und achten Sie auf den Speicherpfad Ihres eigenen Programms.

Keine Antwort. 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-Status. Als nächstes müssen wir nur noch das Client-Programm ausführen, um eine Verbindung herzustellen. Laden Sie den Code hoch:

 1 <?php 2 error_reporting(E_ALL); 3 set_time_limit(0); 4 echo "<h2>TCP/IP Connection</h2>\n"; 5 6 $port = 1935; 7 $ip = "127.0.0.1"; 8 9 /* 10 +------------------------------- 11 *  @socket连接整个过程 12 +------------------------------- 13 *  @socket_create 14 *  @socket_connect 15 *  @socket_write 16 *  @socket_read 17 *  @socket_close 18 +-------------------------------- 19 */ 20 21 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 22 if ($socket < 0) { 23 echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; 24 }else { 25 echo "OK.\n"; 26 } 27 28 echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n"; 29 $result = socket_connect($socket, $ip, $port); 30 if ($result < 0) { 31 echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; 32 }else { 33 echo "连接OK\n"; 34 } 35 36 $in = "Ho\r\n"; 37 $in .= "first blood\r\n"; 38 $out = &#39;&#39;; 39 40 if(!socket_write($socket, $in, strlen($in))) { 41 echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; 42 }else { 43 echo "发送到服务器信息成功!\n"; 44 echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>"; 45 } 46 47 while($out = socket_read($socket, 8192)) { 48 echo "接收服务器回传信息成功!\n"; 49 echo "接受的内容为:",$out; 50 } 51 52 53 echo "关闭SOCKET...\n"; 54 socket_close($socket); 55 echo "关闭OK\n"; 56 ?>

Zu diesem Zeitpunkt hat der Client eine Verbindung zum Server hergestellt.

Fall 2: Detaillierte Codeerklärung

// 设置一些基本的变量
$host = "192.168.1.99";
$port = 1234;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");
//绑定Socket到端口
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n");
// 开始监听链接
$result = socket_listen($socket, 3) or die("Could not set up socketlistener\n");
// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept($socket) or die("Could not accept incomingconnection\n");
// 获得客户端的输入
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// 清空输入字符串
$input = trim($input);
//处理客户端输入并返回结果
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
// 关闭sockets
socket_close($spawn);
socket_close($socket);

Im Folgenden finden Sie eine detaillierte Beschreibung jedes Schritts:

1. Der erste Schritt besteht darin, zwei festzulegen Variablen Zum Speichern der IP-Adresse und des Ports des Servers, auf dem der Socket ausgeführt wird. Sie können ihn auf Ihren eigenen Server und Port festlegen (der Port kann eine Zahl zwischen 1 und 65535 sein), sofern dieser Port nicht verwendet wird 🎜>

[In die Zwischenablage kopieren]

PHP-CODE:

// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;

2 Sie können die Funktion set_time_out() auf der Serverseite verwenden, um sicherzustellen, dass PHP beim Warten auf den Client nicht abläuft um eine Verbindung herzustellen.

[In die Zwischenablage kopieren]

PHP-CODE:

// 超时时间
set_time_limit ( 0 );

3. Basierend auf den vorherigen Schritten ist es an der Zeit, einen Socket mit der Funktion socket_creat() zu erstellen – dieser Funktion Gibt ein Socket-Handle zurück, das in allen zukünftigen In-Funktionen verwendet wird.

[In Zwischenablage kopieren]

PHP-CODE:

// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create
socket\n" );

Der erste Parameter „AF_INET“ wird zur Angabe verwendet der Domänenname;

Der zweite Parameter „SOCK_STREM“ teilt der Funktion mit, welcher Socket-Typ erstellt wird (TCP-Typ in diesem Beispiel)


Wenn Sie also einen UDP-Socket erstellen möchten, können Sie ihn verwenden den folgenden Code:

[In Zwischenablage kopieren]

PHP-CODE:

// 创建 socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create
socket\n" );

4. Sobald ein Socket-Handle erstellt wurde, besteht der nächste Schritt darin, ihn an die angegebene Adresse anzugeben oder zu binden und Port. Dies kann über die Funktion socket_bind() erfolgen , können Sie mit der Überwachung externer Verbindungen beginnen. Sie können einen Listener mit der Funktion socket_listen() starten und eine Zahl angeben (in diesem Fall den zweiten Parameter: 3)

[In die Zwischenablage kopieren]

PHP-CODE:

// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket
listener\n" );

6.到现在,你的服务器除了等待来自客户端的连接请求外基本上什么也没有做.一旦一个客户端的连接被收到,socket_accept()函数便开始起作用了,它接收连接请求并调用另一个子Socket来处理客户端–服务器间的信息.

[Copy to clipboard]
PHP CODE:

//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming
connection\n" );

这个子socket现在就可以被随后的客户端–服务器通信所用了.

7.当一个连接被建立后,服务器就会等待客户端发送一些输入信息,这写信息可以由socket_read()函数来获得,并把它赋值给PHP的$input变量.

[Copy to clipboard]
PHP CODE:

// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read input\n" );
?& gt ;

socker_read的第而个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小.

注意:socket_read函数会一直读取壳户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.

8.现在服务器必须处理这些由客户端发来是数据(在这个例子中的处理仅仅包含数据的输入和回传到客户端).这部分可以由socket_write()函数来完成(使得由通信socket发回一个数据流到客户端成为可能)

[Copy to clipboard]
PHP CODE:

// 处理客户端输入并返回数据
$output = strrev ( $input ) . "\n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write
output\n" );

9.一旦输出被返回到客户端,父/子socket都应通过socket_close()函数来终止

[Copy to clipboard]
PHP CODE:

// 关闭 sockets
socket_close ( $spawn );
socket_close ( $socket );

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP 实现页面静态化的几种方法详解

PHP读取CSV大文件导入数据库的方法

PHP实现十六进制颜色随机生成器功能的方法

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des PHP-Socket-Kommunikationsfalls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn