Swoole 中 TCP、UDP 和長連接、短連接


TCP 服務

swoole 文檔 - TCP 服務

tcp 服務端

<?php
// 1. 創建 swoole 默認創建的是一個同步的阻塞tcp服務
$host = "0.0.0.0"; // 0.0.0.0 代表接聽所有
// 默認是tcp
$serv = new Swoole\Server($host, 9000);
// 添加配置
$serv->set([
  'heartbeat_idle_time' => 10,
  'heartbeat_check_interval' => 3,
]);
// 2. 注冊事件
$serv->on('Start', function($serv) use($host){
    echo "啟動 swoole 監聽的信息tcp:$host:9000\n";
});

//監聽連接進入事件
$serv->on('Connect', function ($serv, $fd) {
    echo "Client: 連接成功.\n";
});

//監聽數據接收事件
$serv->on('Receive', function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//監聽連接關閉事件
$serv->on('Close', function ($serv, $fd) {
    echo "斷開連接.\n";
});
// 3. 啟動服務器
// 阻塞
$serv->start(); // 阻塞與非阻塞

  

這樣就創建了一個 TCP 服務器,監聽本機 9000 端口。

然后先啟動服務,然后再通過 telnet 命令去連接試試

 php swoole_tcp_server.php
 # 啟動 swoole 監聽的信息tcp:0.0.0.0:9000

 telnet 127.0.0.1 9000
# Trying 127.0.0.1...
# Connected to localhost.

  

tcp 客戶端

<?php
// 同步客戶端
$client = new swoole_client(SWOOLE_SOCK_TCP);

//連接到服務器
if (!$client->connect('127.0.0.1', 9000, 0.5))
{
    die("connect failed.");
}

function order()
{
     sleep(4);// 假設某一些操作造成時間很長
     return "order\n";
}

//向服務器發送數據
if (!$client->send(order()))
{
    die("send failed.");
}
//從服務器接收數據
$data = $client->recv();
if (!$data)
{
    die("recv failed.");
}

//關閉連接
$client->close();

// 返回結果給用戶
echo '訂單生成成功'."\n";

  

運行 tcp 客戶端去連接服務端,假設處理需要時間,最后就會輸出訂單生成成功

php swoole_tcp_client.php
# 訂單生成成功

  

UDP 服務

swoole 文檔 - UDP 服務

udp 服務端

<?php
//創建Server對象,監聽 127.0.0.1:9000端口,類型為SWOOLE_SOCK_UDP
$serv = new swoole_server("0.0.0.0", 9000, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

//監聽數據接收事件
$serv->on('Packet', function ($serv, $data, $clientInfo) {
    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
    var_dump($clientInfo);
});
echo "0.0.0.0:9000\n";
//啟動服務器
$serv->start();

  

udp 客戶端

<?php
$client = new swoole_client(SWOOLE_SOCK_UDP);
$client->sendTo('127.0.0.1', 9000, 'upd');
// 接收服務端信息
$data = $client->recv();
var_dump($data);

  

兩種協議

TCP(Transmission Control Protocol 傳輸控制協議):是一種面向連接的,可靠的,基於字節流的傳輸通信協議。

UDP(User Datagram Protocol 用戶數據報協議):是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。

UDP 服務器與 TCP 服務器不同,UDP 沒有連接的概念。啟動 Server 后,客戶端無需 Connect,直接可以向 Server 監聽的 9502 端口發送數據包。

長連接、短連接

  • 長連接: 客戶端和服務端建立連接后不進行斷開,之后客戶端再次訪問這個服務器上的內容時,繼續使用這一條連接通道。
  • 短連接: 客戶端和服務端建立連接,發送完數據后立馬斷開連接。下次要取數據,需要再次建立連接。

Http長連接和TCP長連接的區別

Http長連接 和 TCP長連接的區別在於: TCP 的長連接需要自己去維護一套心跳策略。,而Http只需要在請求頭加入keep-alive:true即可實現長連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM