12、Swoole 中 TCP、UDP 和長連線、短連線

arunfung 發表於 2020-06-29

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即可實現長連線。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
  • 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
  • 文章來源blog.arunfung.com