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
2381 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 fonctionsocket_createet implémenté par lesocket_bindPour la liaison locale, la fonctionsocket_listencommence à écouter les demandes de connexion du client. Elle bloquera jusqu'à ce qu'un client se connecte. La fonctionsocket_acceptrevient. un nouvel objet Socket. Créez une nouvelle connexion. Le fonctionnement du client est également relativement simple. Utilisez la fonctionsocket_connectpour vous connecter au serveur, et utilisez la fonctionsocket_closepour 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 : rrreeeCe 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éelWebSocket 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 WebSocketCode du serveur : rrreeeCe qui précède est un simple serveur WebSocket, utilisant MessageComponentInterfacepour 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 onOpenpour 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 : rrreeeCe qui précède est le code client, qui utilise l'objet WebSocketpour créer une connexion WebSocket et gère les événements onopen, onerror, onmessage, oncloserespectivement. 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. ConclusionGrâ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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!