Maison > développement back-end > tutoriel php > Comment utiliser PHP et Socket pour réaliser une communication de données en temps réel

Comment utiliser PHP et Socket pour réaliser une communication de données en temps réel

WBOY
Libérer: 2023-06-28 08:24:02
original
2597 Les gens l'ont consulté

Avec le développement continu d'Internet, la communication de données en temps réel est devenue la norme pour diverses applications. L'utilisation de PHP et Socket pour implémenter la communication de données en temps réel est l'une des méthodes courantes. Cet article explique comment utiliser PHP et Socket pour réaliser une communication de données en temps réel.

Socket est un mécanisme utilisé pour communiquer entre les applications. Il fournit un ensemble standard d'interfaces permettant à différentes applications de communiquer entre différents ordinateurs. En PHP, vous pouvez utiliser la bibliothèque d'extensions Socket pour implémenter la communication Socket.

Implémentation de la connexion Socket

Pour utiliser la connexion Socket pour réaliser une communication de données en temps réel, vous devez d'abord établir une connexion Socket. Une connexion Socket se compose généralement de deux points de terminaison : le côté serveur et le côté client.

Côté serveur :

$ip = '127.0.0.1';
$port = 8888;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($server, $ip, $port);

socket_listen($server);

$client = socket_accept($server);

socket_close($server);
Copier après la connexion

Côté client :

$ip = '127.0.0.1';
$port = 8888;

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($client, $ip, $port);

socket_close($client);
Copier après la connexion

Ce qui précède est l'opération de base pour établir une connexion Socket, dans laquelle un objet Socket est créé à l'aide de la fonction socket_create et implémenté par le socket_bind Pour la liaison locale, la fonction socket_listen commence à écouter les demandes de connexion du client. Elle bloquera jusqu'à ce qu'un client se connecte. La fonction socket_accept revient. un nouvel objet Socket. Créez une nouvelle connexion. Le fonctionnement du client est également relativement simple. Utilisez la fonction socket_connect pour vous connecter au serveur, et utilisez la fonction socket_close pour fermer la connexion. socket_create 函数创建一个 Socket 对象,socket_bind 函数实现本机的绑定,socket_listen 函数开始监听来自客户端的连接请求,它会一直阻塞直到有客户端连接上来,socket_accept 函数返回一个新的 Socket 对象用于新建连接。客户端的操作也比较简单,使用 socket_connect 函数连接到服务器,并用 socket_close 函数关闭连接。

实现实时数据通信

成功建立 Socket 连接后,就可以开始进行实时数据通信了。在Socket连接中,数据是通过流传输的。服务器端可以通过 socket_recv 函数接收客户端发来的数据,而客户端可以通过 socket_send 函数向服务器端发送数据。

服务器端:

$ip = '127.0.0.1';
$port = 8888;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($server, $ip, $port);

socket_listen($server);

$client = socket_accept($server);

while(true){
    $message = socket_recv($client, 1024, MSG_WAITALL);

    if($message === false){
        socket_close($client);
        break;
    }

    echo "收到消息: $message 
";
}

socket_close($server);
Copier après la connexion

客户端:

$ip = '127.0.0.1';
$port = 8888;

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($client, $ip, $port);

$message = "Hello World!";
socket_send($client, $message, strlen($message), 0);

socket_close($client);
Copier après la connexion

以上是发送和接收消息的基本操作,在服务器端通过循环解决了一次只能接收一条消息的弊端。这种实时数据通信的方式使用简单、高效,若使用合理,十分有利。

使用WebSocket实现实时数据通信

WebSocket是一种基于HTTP协议的协议,可以在浏览器和服务器之间创建持久连接。在PHP中,可以使用Ratchet等第三方库来实现WebSocket通信。

实现WebSocket连接

服务端代码:

require __DIR__ . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class WebSocketServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "有新的客户端连接:{$conn->resourceId}
";
    }

    public function onMessage(ConnectionInterface $from, $message) {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($message);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "客户端离开:{$conn->resourceId}
";
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "发生错误:{$e->getMessage()}
";
        $conn->close();
    }

    public function run() {
        $server = RatchetServerIoServer::factory(
            new RatchetHttpHttpServer(
                new RatchetWebSocketWsServer(
                    $this
                )
            ),
            8080
        );

        echo "WebSocket服务已启动...
";

        $server->run();
    }
}

$server = new WebSocketServer();
$server->run();
Copier après la connexion

以上是一个简单的WebSocket Server,使用 MessageComponentInterface 实现了四个基本方法,分别是 onOpen, onMessage, onClose, onError。 在 onOpen 方法中添加了新客户端的资源 ID 以便在客户端离开时识别出该客户端,onMessage 方法中广播了接收到的消息,onClose 方法中从客户端列表中移除离线客户端,onError 方法中处理了与客户端的连接错误。

客户端代码:

var socket = new WebSocket('ws://' + window.location.host + ':8080');

socket.onopen = function() {
    console.log('WebSocket已打开');
};

socket.onerror = function() {
    console.log('WebSocket出错');
};

socket.onmessage = function(event) {
    console.log('收到消息:' + event.data);
};

socket.onclose = function() {
    console.log('WebSocket已关闭');
};
Copier après la connexion

以上是客户端代码,使用 WebSocket 对象创建了一个 WebSocket 连接,并分别处理了 onopen, onerror, onmessage, onclose 事件。在 onmessage

Communication de données en temps réel

Après avoir établi avec succès la connexion Socket, vous pouvez démarrer la communication de données en temps réel. Dans une connexion Socket, les données sont transférées via des flux. Le serveur peut recevoir des données du client via la fonction socket_recv, et le client peut envoyer des données au serveur via la fonction socket_send.

Côté serveur :

rrreee

Côté client : 🎜rrreee🎜Ce qui précède sont les opérations de base d'envoi et de réception de messages. L'inconvénient de ne recevoir qu'un seul message à la fois est résolu par une boucle côté serveur. Cette méthode de communication de données en temps réel est simple et efficace à utiliser, et s’avère très bénéfique si elle est utilisée correctement. 🎜🎜Utilisez WebSocket pour la communication de données en temps réel🎜🎜WebSocket est un protocole basé sur le protocole HTTP qui peut créer une connexion persistante entre le navigateur et le serveur. En PHP, des bibliothèques tierces telles que Ratchet peuvent être utilisées pour implémenter la communication WebSocket. 🎜🎜Implémenter la connexion WebSocket🎜🎜Code du serveur : 🎜rrreee🎜Ce qui précède est un simple serveur WebSocket, utilisant MessageComponentInterface pour implémenter quatre méthodes de base, à savoir onOpen, onMessage, onClose, onError . Ajout de l'ID de ressource du nouveau client dans la méthode onOpen pour identifier le client à son départ, diffuser le message reçu dans la méthode onMessage, Le client hors ligne est supprimé de la liste des clients dans la méthode onClose, et l'erreur de connexion avec le client est gérée dans la méthode onError. 🎜🎜Code client : 🎜rrreee🎜Ce qui précède est le code client, qui utilise l'objet WebSocket pour créer une connexion WebSocket et gère les événements onopen, onerror, onmessage, onclose respectivement. Le message reçu est imprimé dans la méthode onmessage. 🎜🎜WebSocket rend la communication en temps réel entre le navigateur et le serveur plus facile que le Socket traditionnel. L'utilisation de bibliothèques tierces telles que Ratchet pour implémenter la communication WebSocket peut réduire la complexité du développement. 🎜🎜Conclusion🎜🎜Grâce à l'introduction ci-dessus, nous pouvons voir que l'utilisation de PHP et Socket pour réaliser une communication de données en temps réel est relativement plus flexible et peut être appliquée à divers scénarios d'application. Dans le même temps, la communication WebSocket utilisant des bibliothèques tierces telles que Ratchet est plus facile à démarrer que la communication Socket traditionnelle implémentée côté navigateur et serveur, et peut accélérer le développement de la communication en un temps plus court. Les développeurs peuvent choisir la méthode de communication appropriée en fonction de leurs propres besoins. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal