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.
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();
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(); }
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连接'; }
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);
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
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连接"; }
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!