Maison php教程 PHP开发 Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

Dec 22, 2016 am 10:01 AM
websocket

L'exemple de cet article décrit la pratique de création d'un salon de discussion simple en PHP basé sur websocket. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :
1. Avant-propos

Il y a un simple salon de discussion dans le jeu de l'entreprise. Après l'avoir compris, j'ai réalisé qu'il avait été créé par node websocket. un simple salon de discussion. J’ai donc collecté diverses informations, lu des documents, cherché des exemples et écrit moi-même un simple salon de discussion.

Les connexions http sont divisées en connexions courtes et connexions longues. Les connexions courtes peuvent généralement être implémentées à l'aide d'Ajax, et les connexions longues sont des websockets. Les connexions courtes sont relativement simples à mettre en œuvre, mais consomment trop de ressources. Websocket est efficace mais présente quelques problèmes de compatibilité. Websocket est une ressource de html5

2 Front-end

La mise en œuvre frontale de websocket est très simple et directe

//连接websocket
 
var ws = new WebSocket("ws://127.0.0.1:8000");
 
//成功连接websoc的时候
 
ws.onopen = function(){}
 
//成功获取服务端输出的消息
 
ws.onmessage = function(e){}
 
//连接错误的时候
ws.onerror = function(){}
 
//向服务端发送数据
 
ws.send();
Copier après la connexion

Backend
.

Difficultés de websocket Principalement en arrière-plan

3.1 Processus de connexion websocket
schéma de communication websocket Il s'agit d'un simple schéma de communication entre le client et le serveur. Ce que PHP fait principalement, c'est. pour accepter la clé de cryptage et la renvoyer pour terminer la création du socket Word et l'opération de prise de contact

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

L'image suivante est un organigramme détaillé du websocket de traitement du serveur

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

3.2 Pratique du code

Le processus effectué par le serveur est en gros :

Suspendre un processus de socket pour attendre la connexion

Parcourir le tableau de sockets après une connexion de socket

S'il n'y a pas de prise de contact, effectuez une opération de prise de contact. S'il y a une prise de contact, recevez les données, analysez-les et écrivez. dans le tampon pour la sortie

Ce qui suit est l'exemple de code (j'ai écrit une classe, donc le code est segmenté selon les fonctions. Le bas de l'article donne l'adresse github et quelques pièges que j'ai). rencontré
1. Tout d'abord, créez une socket

//建立套接字
    public function createSocket($address,$port)
    {
      //创建一个套接字
      $socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      //设置套接字选项
      socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
      //绑定IP地址和端口
      socket_bind($socket,$address,$port);
      //监听套接字
      socket_listen($socket);
      return $socket;
    }
Copier après la connexion

2. Mettez la socket dans le tableau

public function __construct($address,$port)
    {
      //建立套接字
      $this->soc=$this->createSocket($address,$port);
      $this->socs=array($this->soc);
 
    }
Copier après la connexion

3. Suspendez le processus Parcourez le tableau de sockets, les principales opérations sont terminées ici

public function run(){
      //挂起进程
      while(true){
        $arr=$this->socs;
        $write=$except=NULL;
        //接收套接字数字 监听他们的状态
        socket_select($arr,$write,$except, NULL);
        //遍历套接字数组
        foreach($arr as $k=>$v){
          //如果是新建立的套接字返回一个有效的 套接字资源
          if($this->soc == $v){
            $client=socket_accept($this->soc);
            if($client <0){
              echo "socket_accept() failed";
            }else{
              // array_push($this->socs,$client);
              // unset($this[]);
              //将有效的套接字资源放到套接字数组
              $this->socs[]=$client;
            }
          }else{
            //从已连接的socket接收数据 返回的是从socket中接收的字节数
            $byte=socket_recv($v, $buff,20480, 0);
            //如果接收的字节是0
            if($byte<7)
              continue;
            //判断有没有握手没有握手则进行握手,如果握手了 则进行处理
            if(!$this->hand[(int)$client]){
              //进行握手操作
              $this->hands($client,$buff,$v);
            }else{
              //处理数据操作
              $mess=$this->decodeData($buff);
                //发送数据
              $this->send($mess,$v);
            }
          }
        }
      }
    }
Copier après la connexion

4. Le processus de prise de contact consiste à recevoir le contenu du websocket de Sec-WebSocket- Key : obtenez la clé et écrivez-la dans le tampon via l'algorithme de cryptage. Le client la vérifiera (la vérification automatique ne nous oblige pas à la traiter) <🎜. >

public function hands($client,$buff,$v)
    {
      //提取websocket传的key并进行加密 (这是固定的握手机制获取Sec-WebSocket-Key:里面的key)
      $buf = substr($buff,strpos($buff,&#39;Sec-WebSocket-Key:&#39;)+18);
      //去除换行空格字符
      $key = trim(substr($buf,0,strpos($buf,"\r\n")));
       //固定的加密算法
      $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));
      $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
      $new_message .= "Upgrade: websocket\r\n";
      $new_message .= "Sec-WebSocket-Version: 13\r\n";
      $new_message .= "Connection: Upgrade\r\n";
      $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
      //将套接字写入缓冲区
      socket_write($v,$new_message,strlen($new_message));
      // socket_write(socket,$upgrade.chr(0), strlen($upgrade.chr(0)));
      //标记此套接字握手成功
      $this->hand[(int)$client]=true;
    }
Copier après la connexion

5. Analyse des données Client (je ne les ai pas chiffrées ici, vous pouvez les chiffrer vous-même si nécessaire)

//解析数据
    public function decodeData($buff)
    {
      //$buff 解析数据帧
      $mask = array();
      $data = &#39;&#39;;
      $msg = unpack(&#39;H*&#39;,$buff); //用unpack函数从二进制将数据解码
      $head = substr($msg[1],0,2);
      if (hexdec($head{1}) === 8) {
        $data = false;
      }else if (hexdec($head{1}) === 1){
        $mask[] = hexdec(substr($msg[1],4,2));
        $mask[] = hexdec(substr($msg[1],6,2));
        $mask[] = hexdec(substr($msg[1],8,2));
        $mask[] = hexdec(substr($msg[1],10,2));
          //遇到的问题 刚连接的时候就发送数据 显示 state connecting
        $s = 12;
        $e = strlen($msg[1])-2;
        $n = 0;
        for ($i=$s; $i<= $e; $i+= 2) {
          $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
          $n++;
        }
        //发送数据到客户端
          //如果长度大于125 将数据分块
          $block=str_split($data,125);
          $mess=array(
            &#39;mess&#39;=>$block[0],
            );
        return $mess;         
      }
Copier après la connexion

6. Écrivez le socket dans le tampon

//发送数据
    public function send($mess,$v)
    {
      //遍历套接字数组 成功握手的 进行数据群发
      foreach ($this->socs as $keys => $values) {
        //用系统分配的套接字资源id作为用户昵称
          $mess[&#39;name&#39;]="Tourist&#39;s socket:{$v}";
          $str=json_encode($mess);
          $writes ="\x81".chr(strlen($str)).$str;
          // ob_flush();
          // flush();
          // sleep(3);
          if($this->hand[(int)$values])
            socket_write($values,$writes,strlen($writes));
        }
    }
Copier après la connexion

7. adresse github git@github.com:rsaLive/websocket.git

① Il est préférable d'exécuter server.php dans la console

Allez dans le répertoire du script server.php (vous pouvez d'abord php -v pour voir si php est configuré. S'il n'y a pas de configuration Linux, configurez le chemin dans bash windows sous Linux)

php -f server.php

<. 🎜>S'il y a une erreur, il vous demandera

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

②Accéder aux fichiers HTML via le serveur

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket

8. Pour les pièges qui ont été surmontés, ouvrez le débogage pour faciliter l'affichage des erreurs

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket①server.php peut être utilisé dans le processus bloqué Sortie imprimée, s'il y a un problème, vous pouvez ajouter impression du code pour le débogage

Vous pouvez marquer chaque jugement et vérifier la console dans quelle section le code est exécuté

Mais après chaque modification du code Vous devez réexécuter le script php server.php

② Si ​​cette erreur se produit, cela peut être

1. Envoyer des données lors de l'initialisation du socket avec le serveur (Le contenu ne peut pas être envoyé pendant la première poignée de main de vérification avec le serveur)

Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket2. Cela se produira également si le message a été vérifié mais que le client ne l'a pas envoyé ou que le message envoyé est vide

Vérifiez donc les données de la prise connectée

③可能浏览器不支持或者服务端没有开启socket开始之前最好验证下

if (window.WebSocket){
  console.log("This browser supports WebSocket!");
} else {
  console.log("This browser does not support WebSocket.");
}
Copier après la connexion

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多Pratique PHP consistant à créer une salle de discussion simple basée sur Websocket相关文章请关注PHP中文网!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

La combinaison de Java et WebSocket : comment réaliser un streaming vidéo en temps réel La combinaison de Java et WebSocket : comment réaliser un streaming vidéo en temps réel Dec 17, 2023 pm 05:50 PM

Avec le développement continu de la technologie Internet, le streaming vidéo en temps réel est devenu une application importante dans le domaine Internet. Pour réaliser un streaming vidéo en temps réel, les technologies clés incluent WebSocket et Java. Cet article explique comment utiliser WebSocket et Java pour implémenter la lecture en streaming vidéo en temps réel et fournit des exemples de code pertinents. 1. Qu'est-ce que WebSocket ? WebSocket est un protocole de communication full-duplex sur une seule connexion TCP. Il est utilisé sur le Web.

Comment réaliser une communication en temps réel en utilisant PHP et WebSocket Comment réaliser une communication en temps réel en utilisant PHP et WebSocket Dec 17, 2023 pm 10:24 PM

Avec le développement continu de la technologie Internet, la communication en temps réel est devenue un élément indispensable de la vie quotidienne. Une communication en temps réel efficace et à faible latence peut être obtenue grâce à la technologie WebSockets, et PHP, en tant que l'un des langages de développement les plus utilisés dans le domaine Internet, fournit également la prise en charge WebSocket correspondante. Cet article explique comment utiliser PHP et WebSocket pour établir une communication en temps réel et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ?

Combinaison de golang WebSocket et JSON : réalisation de la transmission et de l'analyse des données Combinaison de golang WebSocket et JSON : réalisation de la transmission et de l'analyse des données Dec 17, 2023 pm 03:06 PM

La combinaison de golangWebSocket et JSON : réaliser la transmission et l'analyse des données Dans le développement Web moderne, la transmission de données en temps réel devient de plus en plus importante. WebSocket est un protocole utilisé pour établir une communication bidirectionnelle. Contrairement au modèle de requête-réponse HTTP traditionnel, WebSocket permet au serveur de transmettre activement des données au client. JSON (JavaScriptObjectNotation) est un format léger d'échange de données, concis et facile à lire.

PHP et WebSocket : bonnes pratiques pour le transfert de données en temps réel PHP et WebSocket : bonnes pratiques pour le transfert de données en temps réel Dec 18, 2023 pm 02:10 PM

PHP et WebSocket : meilleures pratiques pour le transfert de données en temps réel Introduction : Dans le développement d'applications Web, le transfert de données en temps réel est une exigence technique très importante. Le protocole HTTP traditionnel est un protocole de modèle requête-réponse et ne peut pas assurer efficacement la transmission de données en temps réel. Afin de répondre aux besoins de transmission de données en temps réel, le protocole WebSocket a vu le jour. WebSocket est un protocole de communication full-duplex qui permet de communiquer en full-duplex via une seule connexion TCP. Comparé à H

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser Java et WebSocket pour mettre en œuvre une poussée des cotations boursières en temps réel Comment utiliser Java et WebSocket pour mettre en œuvre une poussée des cotations boursières en temps réel Dec 17, 2023 pm 09:15 PM

Comment utiliser Java et WebSocket pour mettre en œuvre une cotation boursière en temps réel Introduction : Avec le développement rapide d'Internet, la cotation boursière en temps réel est devenue l'une des priorités des investisseurs. La méthode traditionnelle de poussée boursière présente des problèmes tels qu'un retard élevé et une vitesse de rafraîchissement lente. Pour les investisseurs, l'incapacité d'obtenir les dernières informations boursières en temps opportun peut entraîner des erreurs dans les décisions d'investissement. La cotation boursière en temps réel basée sur Java et WebSocket peut résoudre efficacement ce problème, permettant aux investisseurs d'obtenir les dernières informations sur le cours des actions dès que possible.

Comment Java Websocket implémente-t-il la fonction de tableau blanc en ligne ? Comment Java Websocket implémente-t-il la fonction de tableau blanc en ligne ? Dec 17, 2023 pm 10:58 PM

Comment JavaWebsocket implémente-t-il la fonction de tableau blanc en ligne ? À l’ère d’Internet moderne, les gens accordent de plus en plus d’attention à l’expérience de collaboration et d’interaction en temps réel. Le tableau blanc en ligne est une fonction implémentée sur la base de Websocket. Il permet à plusieurs utilisateurs de collaborer en temps réel pour modifier la même planche à dessin et effectuer des opérations telles que le dessin et l'annotation. Il constitue une solution pratique pour l'enseignement en ligne, les réunions à distance, la collaboration en équipe et. d'autres scénarios. 1. Contexte technique WebSocket est un nouveau protocole fourni par HTML5 qu'il implémente.

See all articles