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