Heim  >  Artikel  >  Backend-Entwicklung  >  Inhalt der PHP-Socket-Kommunikation

Inhalt der PHP-Socket-Kommunikation

不言
不言Original
2018-04-23 10:12:351245Durchsuche

Dieser Artikel stellt hauptsächlich die Socket-Kommunikation von PHP vor, die einen gewissen Referenzwert hat. Jetzt können Freunde in Not darauf verweisen.

Was sind TCP/IP und UDP?


TCP/IP (Transmission Control Protocol/Internet Protocol) ist ein industrieller Standardprotokollsatz für Weitverkehrsnetze (WANs).
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.
Inhalt der PHP-Socket-Kommunikation
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.
Inhalt der PHP-Socket-Kommunikation

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.
Wie es funktioniert
Inhalt der PHP-Socket-Kommunikation
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.

Socket-bezogene Funktionen:

socket_accept() akzeptiert eine Socket-Verbindung
socket_bind() bindet den Socket an eine IP-Adresse und einen Port
socket_clear_error() löscht Socket-Fehler oder endgültiger Fehlercode
socket_close() Schließt eine Socket-Ressource
socket_connect() Startet eine Socket-Verbindung
socket_create_listen() Öffnet einen Socket-Listener am angegebenen Port
socket_create_pair() Erzeugt ein Paar Es gibt keine Unterschied beim Einfügen des Sockets in ein Array
socket_create() generiert einen Socket, was dem Generieren einer Socket-Datenstruktur entspricht
socket_get_option() ruft die Socket-Option ab
socket_getpeername() ruft die IP-Adresse einer Fernbedienung ab ähnlicher Host
socket_getsockname() Ruft die IP-Adresse des lokalen Sockets ab
socket_iovec_add() Fügt einem verstreuten/aggregierten Array einen neuen Vektor hinzu
socket_iovec_alloc() Diese Funktion erstellt eine iovec-Datenstruktur, die senden und empfangen kann , lesen und schreiben
socket_iovec_delete() löscht einen 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 von iovec fest data
socket_last_error() Den letzten Fehlercode des aktuellen Sockets abrufen
socket_listen() Alle Verbindungen vom angegebenen Socket abhören
socket_read() Die Daten der angegebenen Länge lesen
socket_readv() Lesen die Daten aus dem Scatter/Aggregate-Array
socket_recv() Enddaten vom Socket zum Cache
socket_recvfrom() Daten vom angegebenen Socket akzeptieren, wenn nicht angegeben, wird der aktuelle Socket als Standard verwendet
socket_recvmsg( ) Nachrichten von iovec empfangen
socket_select() Mehrkanalauswahl
socket_send() Diese Funktion sendet Daten an den verbundenen Socket
socket_sendmsg() Sendet eine Nachricht an den Socket
socket_sendto() Sendet eine Nachricht an den Socket an der angegebenen Adresse
socket_set_block() Setzt ihn im Socket auf Blockmodus
socket_set_nonblock() Setzt den Socket auf Nicht-Blockmodus
socket_set_option() Setzt die Socket-Option
socket_shutdown() Mit dieser Funktion können Sie das Lesen, Schreiben oder den angegebenen Socket schließen
socket_strerror() Detaillierten Fehler der angegebenen Fehlernummer zurückgeben
socket_write() Daten in den Socket-Cache schreiben
socket_writev() Daten in die Streuung/Aggregation schreiben Array

Fall: Demonstration der Socket-Kommunikation

Serverseite:

<?php //确保在连接客户端时不会超时
set_time_limit(0);

$ip = &#39;127.0.0.1&#39;;
$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);
?>

Speichern Sie diese Datei und führen Sie sie aus. Führen Sie netstat -ano aus, um den Portstatus zu überprüfen.
Der Port ist LISTENING, was bedeutet, dass er bereits lauscht. Als nächstes müssen wir nur noch das Client-Programm ausführen, um eine Verbindung herzustellen.
Client:

<?php error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>TCP/IP Connection\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 $in <br>";
}

while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}


echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>

Führen Sie den Server aus und geben Sie Informationen an den Client zurück, soweit der Client eine Verbindung zum Server hergestellt hat

Detaillierter Code Erklä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 Variablen einzurichten, um die IP-Adresse und den Port des Servers zu speichern, auf dem sich der Socket befindet läuft. Sie können Ihren eigenen Server und Port angeben (der Port kann eine Nummer zwischen 1 und 65535 sein), sofern dieser Port nicht verwendet wird

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

2.在服务器端可以使用set_time_out()函数来确保PHP在等待客户端连接时不会超时.

// 超时时间
set_time_limit(0);

3.在前面的基础上,现在该使用socket_creat()函数创建一个Socket了—这个函数返回一个Socket句柄,这个句柄将用在以后所有的函数中.

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

第一个参数”AF_INET”用来指定域名;
第二个参数”SOCK_STREM”告诉函数将创建一个什么类型的Socket(在这个例子中是TCP类型)

因此,如果你想创建一个UDP Socket的话,你可以使用如下的代码:

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

4.一旦创建了一个Socket句柄,下一步就是指定或者绑定它到指定的地址和端口.这可以通过socket_bind()函数来完成.

// 绑定 socket to 指定地址和端口
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

5.当Socket被创建好并绑定到一个端口后,就可以开始监听外部的连接了.PHP允许你由socket_listen()函数来开始一个监听,同时你可以指定一个数字(在这个例子中就是第二个参数:3)

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

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

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

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

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

socker_read的第而个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小.
注意:socket_read函数会一直读取壳户端数据,直到遇见n,t或者0字符.PHP脚本把这写字符看做是输入的结束符.
8.现在服务器必须处理这些由客户端发来是数据(在这个例子中的处理仅仅包含数据的输入和回传到客户端).这部分可以由socket_write()函数来完成(使得由通信socket发回一个数据流到客户端成为可能)

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

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

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

相关推荐:

php实现socket的方法 

PHP之Socket服务器搭建和测试实例分享

Das obige ist der detaillierte Inhalt vonInhalt der PHP-Socket-Kommunikation. 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