Swoole 建立TCP ECHO伺服器
開發環境搭建
1、伺服器執行環境:windows下的ubuntu虛擬機器(vmware)
使用的ubuntu版本為14.04
2、IDE:windows下使用phpstorm
推薦新增swoole-ide-helper到phpstorm的External Libraries(雙擊圖示即可新增)
3、共享資料夾
vmware開啟共享資料夾方式:
安裝Vmware-tools工具包,安裝好客戶機後,VM選單下有一個Reinstall VMware Tools,直接單擊,該工具包被載入到客戶機桌面。
命令列模式下複製安裝的tar檔案到某個資料夾或/tmp下直接解壓。
到相應的解壓目錄下執行vmware-install.pl,一路根據提示安裝即可。
右單擊你需要設定該功能的虛擬機器,單擊options,可以看到Shared Folders功能,單擊該項設定右側的Always enabled後,單擊add新增你需要設定的共享檔案所在的位置即可。
最後,啟動Ubuntu虛擬機器,進入/mnt/hgfs/目錄既可以看到共享目錄。
搭建TCP ECHO 伺服器
新建server.php
<?php
//建立Server物件,監聽 127.0.0.1:9501埠
$serv = new swoole_server("127.0.0.1", 9501);
//監聽連線進入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
//監聽資料接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, "Server: ".$data);
});
//監聽連線關閉事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//啟動伺服器
$serv->start();
使用php server.php
啟動伺服器
搭建非同步TCP客戶端
新建async_client.php檔案
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//註冊連線成功回撥
$client->on('connect', function($cli) {
$cli->send("hello world\n");
});
//註冊連線失敗回撥
$client->on('error', function($cli) {
$cli->send("connect failed\n");
});
//註冊資料接受回撥
$client->on('receive', function($cli, $data) {
echo "Received: $data\n";
sleep(1);
$cli->send("wake up");
});
//註冊連線關閉回撥
$client->on('close', function($cli) {
echo "closed\n";
});
//發起連線
$client->connect('127.0.0.1', 9501, 0.5);
使用php async_client.php
開啟客戶端
使用tcpdump進行抓包分析
首先開啟伺服器,開啟tcpdump監聽sudo tcpdump -iany tcp port 9501
。
使用telnet進行連線測試,連線上後傳送nihao,然後ctrl+]quit結束整個過程。
結果如下:
09:22:06.206068 IP localhost.36366 > localhost.9501: Flags [S], seq 3315326447, win 43690, options [mss 65495,sackOK,TS val 940145 ecr 0,nop,wscale 7], length 0
09:22:06.206140 IP localhost.9501 > localhost.36366: Flags [S.], seq 3454419015, ack 3315326448, win 43690, options [mss 65495,sackOK,TS val 940145 ecr 940145,nop,wscale 7], length 0
09:22:06.206158 IP localhost.36366 > localhost.9501: Flags [.], ack 1, win 342, options [nop,nop,TS val 940145 ecr 940145], length 0
09:22:06.206571 IP localhost.9501 > localhost.36366: Flags [P.], seq 1:7, ack 1, win 342, options [nop,nop,TS val 940145 ecr 940145], length 6
09:22:06.206648 IP localhost.36366 > localhost.9501: Flags [.], ack 7, win 342, options [nop,nop,TS val 940145 ecr 940145], length 0
09:22:10.978286 IP localhost.36366 > localhost.9501: Flags [P.], seq 1:8, ack 7, win 342, options [nop,nop,TS val 941338 ecr 940145], length 7
09:22:10.978302 IP localhost.9501 > localhost.36366: Flags [.], ack 8, win 342, options [nop,nop,TS val 941338 ecr 941338], length 0
09:22:10.978457 IP localhost.9501 > localhost.36366: Flags [P.], seq 7:23, ack 8, win 342, options [nop,nop,TS val 941338 ecr 941338], length 16
09:22:10.978462 IP localhost.36366 > localhost.9501: Flags [.], ack 23, win 342, options [nop,nop,TS val 941338 ecr 941338], length 0
09:22:17.296437 IP localhost.36366 > localhost.9501: Flags [F.], seq 8, ack 23, win 342, options [nop,nop,TS val 942918 ecr 941338], length 0
09:22:17.297329 IP localhost.9501 > localhost.36366: Flags [F.], seq 23, ack 9, win 342, options [nop,nop,TS val 942918 ecr 942918], length 0
09:22:17.297339 IP localhost.36366 > localhost.9501: Flags [.], ack 24, win 342, options [nop,nop,TS val 942918 ecr 942918], length 0
簡單分析:
一開始三次握手,建立連線:首先客戶端隨機分配一個埠來連線伺服器,Flags標誌為[S],伺服器收到以後也返回一個Flags標誌為[S]的響應,最終客戶端在傳送一個Flags標誌為[.]進行確認。此過程即為3此握手。
同理,結束連線時也要經歷3此握手,不過此時的標誌有所不同,分別為[F] [F] [.](也可能是R)。
建立連線成功後,根據指令碼,傳送了Hello\n
給客戶端,在第四個請求那裡也可以看到長度為6個位元組, 型別為[P],接受到資訊以後客戶端返回確認,標誌為[.]。
然後,客戶端輸入了nihao
傳送給客戶端,服務端接受到後再返回Server nihao
給客戶端。
參考網站:
相關文章
- Swoole學習(二)Swoole之TCP伺服器的建立TCP伺服器
- Swoole學習(七)Swoole之非同步TCP伺服器的建立非同步TCP伺服器
- Swoole學習(三)Swoole之UDP伺服器的建立UDP伺服器
- Swoole學習(四)Swoole之簡單WEB伺服器的建立Web伺服器
- Swoole學習(五)Swoole之簡單WebSocket伺服器的建立Web伺服器
- swoole 之 tcp 合包分包TCP
- 配合 Supervisor,在 Laravel 裡使用 Swoole 建立一個 websocket 伺服器LaravelWeb伺服器
- Swoole學習(六)Swoole之定時器的建立與清除定時器
- TCP/IP之TCP的建立與終止TCP
- TCP的連線建立TCP
- 12、Swoole 中 TCP、UDP 和長連線、短連線TCPUDP
- Swoole - TCP流資料邊界問題解決方案TCP
- 【測試】echo傳送和接收TCP/UDP資料包|shell 傳送TCP/UDP資料包TCPUDP
- Laravel 中使用 swoole 專案實戰開發案例一 (建立 swoole 和前端通訊)Laravel前端
- 【TCP/IP】TCP伺服器併發處理&原始碼TCP伺服器原始碼
- swoole 協程原始碼解讀 (協程的建立)原始碼
- Golang 編寫 Tcp 伺服器GolangTCP伺服器
- [UNP] TCP 多程式伺服器TCP伺服器
- 最多能建立多少個 TCP 連線?TCP
- TCP連結的建立和釋放TCP
- echo命令
- Swoole 學習筆記 - TCP 流資料邊界問題解決方案筆記TCP
- bat檔案用echo列印變數顯示ECHO IS OFF/ECHO已關閉BAT變數
- TCP轉發伺服器的例子TCP伺服器
- 系列TCP/IP協議-TCP建立與終止連線(012)TCP協議
- [從0到1編寫伺服器]TCP連線建立與斷開狀態變化伺服器TCP
- 建立一個Twisted Reactor TCP客戶端ReactTCP客戶端
- 單臺伺服器最大tcp連線伺服器TCP
- netty搭建Tcp伺服器實踐NettyTCP伺服器
- libuv中實現tcp伺服器TCP伺服器
- 建立ftp伺服器FTP伺服器
- 理解 TCP(三):連線的建立和釋放TCP
- TCP連線是如何建立和終止的?TCP
- 在 Swoole 伺服器程式中如何實現壓力反饋伺服器
- php swoolePHP
- Swoole 教程
- echo與函式函式
- echo命令詳解