Maison > cadre php > Workerman > le corps du texte

Introduction à la méthode Workerman pour réaliser une connexion bidirectionnelle entre TCP et http

青灯夜游
Libérer: 2021-02-01 12:02:32
avant
5383 Les gens l'ont consulté

Permettez-moi de vous présenter la méthode de workerman pour réaliser une connexion bidirectionnelle entre TCP et http. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Introduction à la méthode Workerman pour réaliser une connexion bidirectionnelle entre TCP et http

Recommandations associées : "Tutoriel Workerman"

Workerman réalise une connexion bidirectionnelle TCP et http

Au départ, je voulais utiliser GatewayWorker pour le compléter, mais au final je voulais l'écrire plus simplement. Utilisez Workerman pour établir des connexions TCP longues et des connexions http courtes avec des appareils intelligents.
Exigences du scénario. L'applet transmet des opérations telles que la mise sous tension de l'appareil ou le réglage de la température au serveur. Le serveur et l'applet ont une courte connexion http et, après avoir obtenu les informations, ils établissent une longue connexion TCP avec l'appareil.

1. Établissez une connexion TCP

protected $socket = 'tcp://0.0.0.0:2346';
protected $processes = 1;
protected $uidConnections = array();
Copier après la connexion

2. Établissez une connexion http dans onWorkerStart

global $ws_worker;
    // 监听5678端口,协议websocket/http
    $ws_worker = new Work('http://0.0.0.0:5678');
    // 网页ws发来数据的时候的处理,可根据需要做处理,这里省略
    $ws_worker->onMessage = function($ws_connection, $data){
    	$redis = new Redis();
        //获取http发过来的http值
        $data = $data['get'];
        if(empty($data['type'])){
            $ws_connection->send("type为空");
        }elseif($data['type'] == 1){
            //开机
            //拿mac去redis验证是否存在,然后拿拿到http进行访问请求开机。做个定时器。到期自动请求设备关机
            $mac = $redis->hGet('facility',$data['mac']);
            if(!$mac){
                $ws_connection->send("mac地址错误");
            }
            $status = $this->sendMessageByUid($mac,'开机');//像指定用户发送消息
            if($status == 1){//回调码,判断是否成功
                $ws_connection->send("开机成功");
            }else{
                $ws_connection->send("发生错误");
            }
        }elseif($data['type'] == 2){
            //关机
            //拿mac去redis验证是否存在,然后拿拿到http进行访问请求关机。
            $mac = $redis->hGet('facility',$data['mac']);
            if(!$mac){
                $ws_connection->send("mac地址错误");
            }
              $status = $this->sendMessageByUid($mac,'关机');//像指定用户发送消息
            if($status == 1){//回调码,判断是否成功
                $ws_connection->send("关机成功");
            }else{
                $ws_connection->send("发生错误");
            }
        }
    };
    $ws_worker->listen();

}
Copier après la connexion

Le code ci-dessus est un cas de démonstration. Faisons quelques tests de connexion. Pour les codes commerciaux, veuillez vous référer à

3. Connexion TCP et connexion http

 /**
 * 当连接建立时触发的回调函数
 * @param $connection
 */
public function onConnect($connection)
{
  $connection->send(“tcp连接\n");
    echo 'tcp连接';
    
}
Copier après la connexion

Nous faisons la demande de connexion TCP d'un client.

<?php set_time_limit(0);

$host = "xxxxxxxx";//这里是你的服务器ip
$port = 2346;//这里是你的服务器端口
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create  socket\n");

$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");
$mac = array("mac"=>'123456','ip'=>'1.2.3.4');

socket_write($socket, json_encode($mac)) or die("Write failed\n");
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {
    echo '1';
    echo("Response was:" . $buff . "\n");
    echo("input what you want to say to the server:\n");
    $text = fgets(STDIN);
    socket_write($socket, $text);
}
socket_close($socket);
Copier après la connexion

Nous exécutons ce fichier php et ce fichier serveur dans le terminal lorsque la connexion est établie. Le serveur affichera la connexion TCP (c'est une connexion longue en ce moment)

Remarque : lors de l'envoi de messages via une connexion TCP, faites attention au problème des paquets collants. Ajouter "n" après chaque message représente une nouvelle ligne

Introduction à la méthode Workerman pour réaliser une connexion bidirectionnelle entre TCP et http
Nous essayons une connexion http, qui est beaucoup plus simple. Accédez simplement à l'url

global $ws_worker;
$ws_worker = new Work('http://0.0.0.0:5678');
$ws_worker->onMessage = function($ws_connection, $data){
        echo "http连接";
}
Copier après la connexion

Introduction à la méthode Workerman pour réaliser une connexion bidirectionnelle entre TCP et http
Vous devriez tous comprendre cet exemple simple. Ensuite, il ne reste plus que le code métier, et c’est à vous de l’exécuter.

Pour plus de connaissances liées à la programmation, veuillez visiter : Enseignement de la programmation ! !

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:csdn.net
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