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 服務端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長鏈接的區別在於: TCP 的長鏈接須要本身去維護一套心跳策略。,而Http只須要在請求頭加入keep-alive:true
便可實現長鏈接。