<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # [Connection類提供的接口](https://www.workerman.net/doc/workerman/tcp-connection.html#Connection%E7%B1%BB%E6%8F%90%E4%BE%9B%E7%9A%84%E6%8E%A5%E5%8F%A3) Workerman中有兩個重要的類Worker與Connection。 每個客戶端連接對應一個Connection對象,可以設置對象的onMessage、onClose等回調,同時提供了向客戶端發送數據send接口與關閉連接close接口,以及其它一些必要的接口。 可以說Worker是一個監聽容器,負責接受客戶端連接,并把連接包裝成connection對象式提供給開發者操作。· >[danger]TcpConnection沒有connect()方法,一般不用來進行手動實例化,一般出現在回調屬性里如:`onConnect = function(TcpConnection $connection)` ``` use Workerman\Worker; use Workerman\Connection\TcpConnection; use Workerman\Connection\AsyncTcpConnection; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('tcp://0.0.0.0:8686'); $worker->onMessage = function($connection, $data) { // $c_str=var_export(json_encode($connection,JSON_UNESCAPED_UNICODE),true); // $c_str=json_encode(get_class_methods($connection), JSON_UNESCAPED_UNICODE); $c_str=json_encode(get_object_vars($connection), JSON_UNESCAPED_UNICODE); $c_str=json_encode(get_class_vars(get_class($connection)), JSON_UNESCAPED_UNICODE); // $r = new \ReflectionClass($connection); $r = new \ReflectionObject($connection); $c_str=json_encode($r->getConstants(), JSON_UNESCAPED_UNICODE); $c_str=json_encode($r->getProperties(\ReflectionMethod::IS_PUBLIC), JSON_UNESCAPED_UNICODE); $c_str1=json_encode($r->getMethods(\ReflectionMethod::IS_PUBLIC), JSON_UNESCAPED_UNICODE); // file_put_contents("./aaa.json", $c_str); // $c_str=var_export(json_encode(['a'=>1,'b'=>2],JSON_UNESCAPED_UNICODE),true); $connection->send('接受客戶端消息成功'.$c_str); }; ``` **屬性** json_encode($r->getProperties(\ReflectionMethod::IS_PUBLIC), JSON_UNESCAPED_UNICODE); ``` [ { "name": "onMessage", "class": "Workerman\Connection\TcpConnection" }, { "name": "onClose", "class": "Workerman\Connection\TcpConnection" }, { "name": "onError", "class": "Workerman\Connection\TcpConnection" }, { "name": "onBufferFull", "class": "Workerman\Connection\TcpConnection" }, { "name": "onBufferDrain", "class": "Workerman\Connection\TcpConnection" }, { "name": "protocol", "class": "Workerman\Connection\TcpConnection" }, { "name": "transport", "class": "Workerman\Connection\TcpConnection" }, { "name": "worker", "class": "Workerman\Connection\TcpConnection" }, { "name": "bytesRead", "class": "Workerman\Connection\TcpConnection" }, { "name": "bytesWritten", "class": "Workerman\Connection\TcpConnection" }, { "name": "id", "class": "Workerman\Connection\TcpConnection" }, { "name": "maxSendBufferSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "context", "class": "Workerman\Connection\TcpConnection" }, { "name": "defaultMaxSendBufferSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "maxPackageSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "defaultMaxPackageSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "connections", "class": "Workerman\Connection\TcpConnection" }, { "name": "_statusToString", "class": "Workerman\Connection\TcpConnection" }, { "name": "statistics", "class": "Workerman\Connection\ConnectionInterface" } ] ``` json_encode(get_object_vars($connection), JSON_UNESCAPED_UNICODE);查詢不到$connection數據 json_encode(get_class_vars(get_class($connection)), JSON_UNESCAPED_UNICODE); ``` { "onMessage": null, "onClose": null, "onError": null, "onBufferFull": null, "onBufferDrain": null, "protocol": null, "transport": "tcp", "worker": null, "bytesRead": 0, "bytesWritten": 0, "id": 0, "maxSendBufferSize": 1048576, "context": null, "maxPackageSize": 1048576, "defaultMaxSendBufferSize": 1048576, "defaultMaxPackageSize": 10485760, "connections": [ ], "_statusToString": { "0": "INITIAL", "1": "CONNECTING", "2": "ESTABLISHED", "4": "CLOSING", "8": "CLOSED" }, "statistics": { "connection_count": 0, "total_request": 0, "throw_exception": 0, "send_fail": 0 } } ``` 方法 json_encode($r->getMethods(\ReflectionMethod::IS_PUBLIC), JSON_UNESCAPED_UNICODE); ``` [ { "name": "__construct", "class": "Workerman\Connection\TcpConnection" }, { "name": "getStatus", "class": "Workerman\Connection\TcpConnection" }, { "name": "send", "class": "Workerman\Connection\TcpConnection" }, { "name": "getRemoteIp", "class": "Workerman\Connection\TcpConnection" }, { "name": "getRemotePort", "class": "Workerman\Connection\TcpConnection" }, { "name": "getRemoteAddress", "class": "Workerman\Connection\TcpConnection" }, { "name": "getLocalIp", "class": "Workerman\Connection\TcpConnection" }, { "name": "getLocalPort", "class": "Workerman\Connection\TcpConnection" }, { "name": "getLocalAddress", "class": "Workerman\Connection\TcpConnection" }, { "name": "getSendBufferQueueSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "getRecvBufferQueueSize", "class": "Workerman\Connection\TcpConnection" }, { "name": "isIpV4", "class": "Workerman\Connection\TcpConnection" }, { "name": "isIpV6", "class": "Workerman\Connection\TcpConnection" }, { "name": "pauseRecv", "class": "Workerman\Connection\TcpConnection" }, { "name": "resumeRecv", "class": "Workerman\Connection\TcpConnection" }, { "name": "baseRead", "class": "Workerman\Connection\TcpConnection" }, { "name": "baseWrite", "class": "Workerman\Connection\TcpConnection" }, { "name": "doSslHandshake", "class": "Workerman\Connection\TcpConnection" }, { "name": "pipe", "class": "Workerman\Connection\TcpConnection" }, { "name": "consumeRecvBuffer", "class": "Workerman\Connection\TcpConnection" }, { "name": "close", "class": "Workerman\Connection\TcpConnection" }, { "name": "getSocket", "class": "Workerman\Connection\TcpConnection" }, { "name": "bufferIsEmpty", "class": "Workerman\Connection\TcpConnection" }, { "name": "destroy", "class": "Workerman\Connection\TcpConnection" }, { "name": "__destruct", "class": "Workerman\Connection\TcpConnection" } ] ``` json_encode(get_class_methods($connection), JSON_UNESCAPED_UNICODE); ``` [ "__construct", "getStatus", "send", "getRemoteIp", "getRemotePort", "getRemoteAddress", "getLocalIp", "getLocalPort", "getLocalAddress", "getSendBufferQueueSize", "getRecvBufferQueueSize", "isIpV4", "isIpV6", "pauseRecv", "resumeRecv", "baseRead", "baseWrite", "doSslHandshake", "pipe", "consumeRecvBuffer", "close", "getSocket", "bufferIsEmpty", "destroy", "__destruct" ] ``` 常量 json_encode($r->getConstants(), JSON_UNESCAPED_UNICODE); ``` { "READ_BUFFER_SIZE": 65535, "STATUS_INITIAL": 0, "STATUS_CONNECTING": 1, "STATUS_ESTABLISHED": 2, "STATUS_CLOSING": 4, "STATUS_CLOSED": 8 } ``` 示例 ``` use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; // 設置所有連接的默認應用層發送緩沖區大小默認1024 TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024; // 每個連接能夠接收的最大包包長。不設置默認為10MB // 設置每個連接接收的數據包最大為1024000字節 TcpConnection::$defaultMaxPackageSize = 1024000; $worker = new Worker('websocket://0.0.0.0:8484'); #當客戶端與Workerman建立連接時(TCP三次握手完成后)觸發的回調函數。每個連接只會觸發一次onConnect回調. #在onConnect事件里無法確認對方是誰。要想知道對方是誰,需要客戶端發送鑒權數據,例如某個token或者用戶名密碼之類,在onMessage回調里做鑒權. #udp是無連接的,所以當使用udp協議時不會觸發onConnect回調,也不會觸發onClose回調 $worker->onConnect = function(TcpConnection $connection) { //連接的id 每個進程內部會維護一個自增的connection id,所以多個進程(設置$worker->count的值大于1)之間的connection id會有重復 如果想要不重復的connection id 可以根據需要給connection->id重新賦值,例如加上worker->id前綴 echo $worker->id . $connection->id; //獲得該連接的客戶端ip echo $connection->getRemoteIp() . "\n"; // 獲得該連接的客戶端端口 echo $connection->getRemotePort() ."\n"; // 設置當前連接的協議類 $connection->protocol = 'Workerman\\Protocols\\Http'; // 當一個客戶端發來數據時,轉發給當前進程所維護的其它所有客戶端 foreach($connection->worker->connections as $con) { $con->send("111"); } // 設置當前連接的應用層發送緩沖區大小,默認Connection::defaultMaxSendBufferSize(1MB) // 設置當前連接的應用層發送緩沖區大小為102400字節 $connection->maxSendBufferSize = 102400; // 將當前連接的數據流導入到目標連接。內置了流量控制。此方法做TCP代理非常有用 // 建立本地80端口的異步連接 $connection_to_80 = new AsyncTcpConnection('tcp://127.0.0.1:80'); // 設置將當前客戶端連接的數據導向80端口的連接 $connection->pipe($connection_to_80); // 設置80端口連接返回的數據導向客戶端連接 $connection_to_80->pipe($connection); // 執行異步連接 $connection_to_80->connect(); // 使當前連接停止接收數據。該連接的onMessage回調將不會被觸發。此方法對于上傳流量控制非常有用 $connection->pauseRecv(); // 使當前連接繼續接收數據。此方法與Connection::pauseRecv配合使用,對于上傳流量控制非常有用 // 上面的pauseRecv停止接受數據,這里30秒后恢復接收數據 Timer::add(30, function($connection){ $connection->resumeRecv(); }, array($connection), false); // 可以在這里判斷連接來源是否合法,不合法就關掉連接 // $_SERVER['HTTP_ORIGIN']標識來自哪個站點的頁面發起的websocket連接 if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net'){ // 安全的關閉連接.調用close會等待發送緩沖區的數據發送完畢后才關閉連接,并觸發連接的onClose回調 // 參數為可選參數,要發送的數據(如果有指定協議,則會自動調用協議的encode方法打包$data數據),當數據發送完畢后關閉連接,隨后會觸發onClose回調 $connection->close("hello\n"); // 立刻關閉連接。與close不同之處是,調用destroy后即使該連接的發送緩沖區還有數據未發送到對端,連接也會立刻被關閉,并立刻觸發該連接的onClose回調。 $connection->destroy(); } // 設置連接的onMessage回調,作用與Worker::$onMessage回調相同,區別是只針對當前連接有效,也就是可以針對某個連接的設置onMessage回調 $connection->onMessage = function(TcpConnection $connection, $data) { var_dump($data); //send(mixed $data [,$raw = false]) // 默認第二個參數為false,在發送數據時會根據協議加載協議類庫對數據進行轉換在發送,如websocket協議時會自動調用\Workerman\Protocols\Websocket::encode打包成websocket協議數據后發送 // 第二個參數為true則不調用協議類轉換數據而是直接發送原始數據 // 可以在$connection回調里也可以在$work回調里 $connection->send('receive success'); }; $connection->onError = function(TcpConnection $connection) { echo "connection onError\n"; }; // 設置連接的onClose回調,此回調與Worker::$onClose回調作用相同,區別是只針對當前連接有效,也就是可以針對某個連接的設置onClose回調 $connection->onClose = function(TcpConnection $connection) { echo "connection onClose\n"; }; // 作用與Worker::$onBufferFull回調相同,區別是只針對當前連接起作用,即可以單獨設置某個連接的onBufferFull回調 $connection->onBufferFull = function(TcpConnection $connection) { echo "connection onBufferFull\n"; }; // 作用與Worker::$onBufferDrain回調相同,區別是只針對當前連接起作用,即可以單獨設置某個連接的onBufferDrain回調 $connection->onBufferDrain = function(TcpConnection $connection) { echo "connection onBufferDrain\n"; }; }; #設置Worker子進程啟動時的回調函數,每個子進程啟動時都會執行 #注意:onWorkerStart是在子進程啟動時運行的,如果開啟了多個子進程($worker->count > 1),每個子進程運行一次,則總共會運行$worker->count次 $worker->onWorkerStart = function($worker){ #當前worker進程的id編號,范圍為0到$worker->count-1 echo "進程id:{$worker->id} Worker starting...\n"; }; #當客戶端通過連接發來數據時(Workerman收到數據時)觸發的回調函數 $worker->onMessage = function($connection,$data){ $connection->send("我已收到你發來的數據:".$data); foreach ($connection->worker->connections as $connectionId => $cn) { $cn->send("我已收到客戶端的數據:".$data); } }; // 運行worker Worker::runAll(); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看