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 服務
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