您好,登錄后才能下訂單哦!
這篇文章主要介紹workerman如何實(shí)現(xiàn)tcp和http雙向連接,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
workerman實(shí)現(xiàn)tcp和http雙向連接
本來(lái)想采用GatewayWorker來(lái)完成的,最后還是想寫(xiě)簡(jiǎn)單一點(diǎn)。用workerman進(jìn)行和智能設(shè)備的tcp長(zhǎng)連接和http的短連接。
場(chǎng)景需求。小程序端傳給服務(wù)器開(kāi)啟設(shè)備或調(diào)節(jié)溫度等操作。服務(wù)器和小程序http短連接,拿到信息后與設(shè)備進(jìn)行tcp長(zhǎng)連接。
1、建立tcp連接
protected $socket = 'tcp://0.0.0.0:2346'; protected $processes = 1; protected $uidConnections = array();
2、在onWorkerStart建立http連接
global $ws_worker; // 監(jiān)聽(tīng)5678端口,協(xié)議websocket/http $ws_worker = new Work('http://0.0.0.0:5678'); // 網(wǎng)頁(yè)ws發(fā)來(lái)數(shù)據(jù)的時(shí)候的處理,可根據(jù)需要做處理,這里省略 $ws_worker->onMessage = function($ws_connection, $data){ $redis = new Redis(); //獲取http發(fā)過(guò)來(lái)的http值 $data = $data['get']; if(empty($data['type'])){ $ws_connection->send("type為空"); }elseif($data['type'] == 1){ //開(kāi)機(jī) //拿mac去redis驗(yàn)證是否存在,然后拿拿到http進(jìn)行訪問(wèn)請(qǐng)求開(kāi)機(jī)。做個(gè)定時(shí)器。到期自動(dòng)請(qǐng)求設(shè)備關(guān)機(jī) $mac = $redis->hGet('facility',$data['mac']); if(!$mac){ $ws_connection->send("mac地址錯(cuò)誤"); } $status = $this->sendMessageByUid($mac,'開(kāi)機(jī)');//像指定用戶發(fā)送消息 if($status == 1){//回調(diào)碼,判斷是否成功 $ws_connection->send("開(kāi)機(jī)成功"); }else{ $ws_connection->send("發(fā)生錯(cuò)誤"); } }elseif($data['type'] == 2){ //關(guān)機(jī) //拿mac去redis驗(yàn)證是否存在,然后拿拿到http進(jìn)行訪問(wèn)請(qǐng)求關(guān)機(jī)。 $mac = $redis->hGet('facility',$data['mac']); if(!$mac){ $ws_connection->send("mac地址錯(cuò)誤"); } $status = $this->sendMessageByUid($mac,'關(guān)機(jī)');//像指定用戶發(fā)送消息 if($status == 1){//回調(diào)碼,判斷是否成功 $ws_connection->send("關(guān)機(jī)成功"); }else{ $ws_connection->send("發(fā)生錯(cuò)誤"); } } }; $ws_worker->listen(); }
上面代碼為demo案例。下面做點(diǎn)連接的測(cè)試,業(yè)務(wù)代碼自行參考
3、tcp連接與http連接
/** * 當(dāng)連接建立時(shí)觸發(fā)的回調(diào)函數(shù) * @param $connection */ public function onConnect($connection) { $connection->send(“tcp連接\n"); echo 'tcp連接'; }
我們做一個(gè)客戶端的tcp連接請(qǐng)求。
<?php set_time_limit(0); $host = "xxxxxxxx";//這里是你的服務(wù)器ip $port = 2346;//這里是你的服務(wù)器端口 $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);
我們?cè)诮K端運(yùn)行這個(gè)php文件和server文件,當(dāng)建立了連接時(shí)。服務(wù)端會(huì)輸出tcp連接(此時(shí)已是長(zhǎng)連接)
注:當(dāng)用tcp連接發(fā)送消息的時(shí)候,注意粘包問(wèn)題。每個(gè)消息后加"\n"代表?yè)Q行
我們?cè)谠囈幌耯ttp連接,http連接就簡(jiǎn)單多了。url訪問(wèn)就可以了
global $ws_worker; $ws_worker = new Work('http://0.0.0.0:5678'); $ws_worker->onMessage = function($ws_connection, $data){ echo "http連接"; }
這個(gè)簡(jiǎn)單的例子應(yīng)該都懂。接下來(lái)就差業(yè)務(wù)代碼了,就看自己發(fā)揮了。
以上是“workerman如何實(shí)現(xiàn)tcp和http雙向連接”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。