溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

workerman如何實(shí)現(xiàn)tcp和http雙向連接

發(fā)布時(shí)間:2020-12-18 09:17:15 來(lái)源:億速云 閱讀:587 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹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行

workerman如何實(shí)現(xiàn)tcp和http雙向連接
我們?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連接";
}

workerman如何實(shí)現(xiàn)tcp和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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI