Home  >  Article  >  PHP Framework  >  Introduction to workerman's method of realizing two-way connection between tcp and http

Introduction to workerman's method of realizing two-way connection between tcp and http

青灯夜游
青灯夜游forward
2020-12-17 17:59:185373browse

Let me introduce to you the method of workerman to achieve two-way connection between tcp and http. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

Introduction to workerman's method of realizing two-way connection between tcp and http

Related recommendations: "workerman Tutorial"

workerman realizes tcp and http two-way connection

Originally I wanted to use GatewayWorker to complete it, but in the end I wanted to write it simpler. Use Workerman to make long tcp connections and short http connections with smart devices.
Scenario requirements. The applet transmits operations such as turning on the device or adjusting the temperature to the server. The server and the applet have a short http connection, and after getting the information, they make a long tcp connection with the device.

1. Establish tcp connection

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

2. Establish http connection in 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();

}

The above code is a demo case. Let's do some connection tests. For business codes, please refer to

3. TCP connection and http connection

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

We make a client's TCP connection request.

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

We run this php file and server file in the terminal when the connection is established. The server will output the tcp connection (it is a long connection at this time)

Note: When sending messages using a tcp connection, pay attention to the problem of sticky packets. Adding "\n" after each message represents a newline

Introduction to workermans method of realizing two-way connection between tcp and http
We are trying an http connection, which is much simpler. Just access the url

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

Introduction to workermans method of realizing two-way connection between tcp and http
You should all understand this simple example. Next, the only thing left is the business code, and it’s up to you to perform.

For more programming-related knowledge, please visit: Programming Teaching! !

The above is the detailed content of Introduction to workerman's method of realizing two-way connection between tcp and http. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:csdn.net. If there is any infringement, please contact admin@php.cn delete