Aktueller Standort: Startseite> Neueste Artikel> Wie lesen Socket_export_Stream und Fread -Funktionen Daten zusammen? Detaillierte Erklärung praktischer Beispiele

Wie lesen Socket_export_Stream und Fread -Funktionen Daten zusammen? Detaillierte Erklärung praktischer Beispiele

gitbox 2025-08-30

1. Verstehen Sie die Funktion von Socket_export_Stream

Die Funktion der Funktion Socket_export_Stream besteht darin, eine Roh -Socket -Ressource in eine Stream -Ressource umzuwandeln, die mit Standard -PHP -Stream -Funktionen kompatibel ist. Es ermöglicht die zugrunde liegende Socket -Verbindung mit Stream -Lesefunktionen wie Fread , wodurch das Lesen von Daten bequemer wird.

 <span><span>resource </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>

Der Rückgabewert ist eine Standard -Stream -Ressource, sodass Sie Fread- , FWrite- oder andere Stream -Betriebsfunktionen verwenden können, um Daten zu lesen oder zu schreiben.

2. Verstehen Sie die freie Funktion

Fread ist eine Funktion, mit der Daten einer bestimmten Anzahl von Bytes aus einem Dateizeiger oder Stream gelesen werden. Es wird häufig mit Fopen , Socket_export_stream usw. verwendet, um Daten im Stream zu lesen.

 <span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">fread</span></span><span> ( resource </span><span><span class="hljs-variable">$handle</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>

Parameter:

  • $ handle ist eine Stream -Ressource, die eine Stream -Ressource sein kann, die von socket_export_stream zurückgegeben wird.

  • $ Länge ist die Anzahl der zu lesen.

Fread gibt den Inhalt des Lesegeräts zurück, und wenn die Daten nicht gelesen werden können, wird eine leere Zeichenfolge zurückgegeben.

3. Praktisches Beispiel: Daten lesen zwischen Client und Server

Wir erstellen eine einfache Instanz des TCP -Clients, der mit dem Server kommuniziert. Der Client stellt eine Verbindung zum Server her, sendet die Anforderung über den Socket und verwendet Fread , um die Antwort vom Server zu lesen.

3.1 serverseitiger Code erstellen

 <span><span><span class="hljs-comment">// Serverseitiger Code</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// erstellen socket Ressource</span></span><span>
</span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Der Server wird gestartet,Warten auf die Kundenverbindung...\n"</span></span><span>;

</span><span><span class="hljs-comment">// Warten auf die Kundenverbindung</span></span><span>
</span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-comment">// Senden Sie Daten an den Client</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));

</span><span><span class="hljs-comment">// Schließen Sie die Verbindung</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span></span>

3.2 Clientcode erstellen

 <span><span><span class="hljs-comment">// Clientcode</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// erstellen socket Ressource</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);

</span><span><span class="hljs-comment">// Wille socket Ressource转换为流Ressource</span></span><span>
</span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);

</span><span><span class="hljs-comment">// Daten aus dem Stream lesen</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// Lesen Sie am meisten 1024 Bytedaten</span></span><span>

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Serverantwort: "</span></span><span> . </span><span><span class="hljs-variable">$response</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;

</span><span><span class="hljs-comment">// Schließen Sie die Verbindung</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

4. Code Parsen

  • Serverseite: Zuerst haben wir einen TCP -Socket erstellt und an die lokale Adresse und den Port 8080 gebunden. Der Server hört zu, während der Client eine Verbindung herstellt. Wenn eine Client -Verbindung vorhanden ist, akzeptiert sie die Verbindung und sendet eine Nachricht und schließt dann die Verbindung.

  • Client: Der Client erstellt zuerst einen TCP -Socket und stellt eine Verbindung zum Server her. Verwenden Sie dann Socket_export_stream , um den Socket in eine Stream -Ressource umzuwandeln. Als nächstes lesen wir die vom Server zurückgegebenen Daten über die Fread -Funktion.

5. Häufig gestellte Fragen und Vorsichtsmaßnahmen

5.1 Die Daten werden nicht vollständig gelesen

Bei der Netzwerkprogrammierung ist das Problem, das häufig beim Lesen von Daten auftritt, das unvollständige Lesen von Daten. Beispielsweise kann die vom Server gesendete Datenmenge viel größer sein als die Anzahl der Bytes gleichzeitig. Zu diesem Zeitpunkt müssen Sie einige Datenspleißen durchführen, bis alle Daten gelesen werden.

 <span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>)) {
    </span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// Jeweils lesen 1024 Byte</span></span><span>
    </span><span><span class="hljs-variable">$response</span></span><span> .= </span><span><span class="hljs-variable">$chunk</span></span><span>;
}
</span></span>

5.2 Nicht-Blocking-Modus

PHP Socket blockiert standardmäßig, dh Freead kann warten, bis die Daten vor der Rückkehr eingetroffen sind. Wenn Sie Daten nicht blockieren müssen, können Sie Socket_Set_Nonblock verwenden, um den Socket auf den Nicht-Blocking-Modus festzulegen, sodass FreeD sofort zurückgibt, selbst wenn die Daten nicht vollständig gelesen werden.

 <span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

6. Zusammenfassung

Durch die Funktionen von Socket_export_Stream und Fread können wir Socket -Datenströme leichter betreiben. Diese beiden Funktionen können in Kombination verwendet werden, damit wir einfach Netzwerkdaten von einem Remote -Server wie manipulieren, wie ein Dateistrom zu manipulieren. In der tatsächlichen Entwicklung ist dieser Ansatz sehr geeignet, um Echtzeit- und kontinuierliche Dateninteraktionen zu behandeln.

Hoffentlich können Sie anhand der Beispiele in diesem Artikel besser verstehen, wie Sie diese beiden Funktionen für die tatsächlichen Entwicklungs- und Prozessdaten kombinieren, die von Steckdosen erhalten werden.