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

TCP 服務

swoole 文檔 - TCP 服務php

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 端口。swoole

而後先啓動服務,而後再經過 telnet 命令去鏈接試試tcp

 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 客戶端code

<?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 客戶端去鏈接服務端,假設處理須要時間,最後就會輸出訂單生成成功server

php swoole_tcp_client.php
# 訂單生成成功

  

UDP 服務

swoole 文檔 - UDP 服務對象

udp 服務端blog

<?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便可實現長鏈接。

相關文章
相關標籤/搜索