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);
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);
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_create
et implémenté par lesocket_bind
Pour la liaison locale, la fonctionsocket_listen
commence à écouter les demandes de connexion du client. Elle bloquera jusqu'à ce qu'un client se connecte. La fonctionsocket_accept
revient. un nouvel objet Socket. Créez une nouvelle connexion. Le fonctionnement du client est également relativement simple. Utilisez la fonctionsocket_connect
pour vous connecter au serveur, et utilisez la fonctionsocket_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);
客户端:
$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);
以上是发送和接收消息的基本操作,在服务器端通过循环解决了一次只能接收一条消息的弊端。这种实时数据通信的方式使用简单、高效,若使用合理,十分有利。
使用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();
以上是一个简单的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已关闭'); };
以上是客户端代码,使用WebSocket
对象创建了一个 WebSocket 连接,并分别处理了onopen, onerror, onmessage, onclose
事件。在onmessage
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, utilisantMessageComponentInterface
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 : rrreeeCe 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. 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!