Heim  >  Artikel  >  PHP-Framework  >  Einführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und http

Einführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und http

青灯夜游
青灯夜游nach vorne
2020-12-17 17:59:185362Durchsuche

Lassen Sie mich Ihnen workerman die Methode zur Realisierung einer bidirektionalen TCP- und http-Verbindung vorstellen. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Einführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und http

Verwandte Empfehlungen: „workerman Tutorial

workerman implementiert bidirektionale TCP- und HTTP-Verbindungen

Ursprünglich wollte ich GatewayWorker verwenden, um es fertigzustellen, aber am Ende wollte ich es schaffen einfacher. Verwenden Sie Workerman, um lange TCP-Verbindungen und kurze HTTP-Verbindungen mit Smart-Geräten herzustellen.
Szenarioanforderungen. Das Applet überträgt Vorgänge wie das Einschalten des Geräts oder das Anpassen der Temperatur an den Server. Der Server und das Applet verfügen über eine kurze HTTP-Verbindung und stellen nach Erhalt der Informationen eine lange TCP-Verbindung mit dem Gerät her.

1. Stellen Sie eine TCP-Verbindung her

protected $socket = 'tcp://0.0.0.0:2346';
protected $processes = 1;
protected $uidConnections = array();

2. Stellen Sie eine HTTP-Verbindung in onWorkerStart her

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();

}

Der obige Code ist ein Demo-Fall. Lassen Sie uns einige Verbindungstests durchführen. Bitte beachten Sie den Geschäftscode. 3. TCP-Verbindung und HTTP-Verbindung. Wir stellen eine TCP-Verbindungsanfrage vom Client.

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

Wir führen diese PHP-Datei und Serverdatei im Terminal aus, wenn die Verbindung hergestellt ist. Der Server gibt eine TCP-Verbindung aus (zu diesem Zeitpunkt handelt es sich um eine lange Verbindung)

Hinweis: Achten Sie beim Senden von Nachrichten über eine TCP-Verbindung auf das Problem der Sticky-Pakete. Das Hinzufügen von „n“ nach jeder Nachricht stellt einen Zeilenumbruch dar

Wir versuchen eine HTTP-Verbindung, die viel einfacher ist. Greifen Sie einfach auf die URL zu

<?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);

Einführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und http
Sie alle sollten dieses einfache Beispiel verstehen. Als Nächstes müssen Sie nur noch den Geschäftscode festlegen, dessen Umsetzung nun an Ihnen liegt.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und httpProgrammierlehre
! !

Das obige ist der detaillierte Inhalt vonEinführung in die Workerman-Methode zur Realisierung einer bidirektionalen Verbindung zwischen TCP und http. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen