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