說明:機(jī)器還是之前的機(jī)器,環(huán)境還是還是之前的環(huán)境换途。
手冊絕對是我們學(xué)習(xí)的第一手資料懊渡,也是最有價值的資料刽射,所以請不要丟掉它。
首先進(jìn)入之前進(jìn)入我的目錄
[zhengzongqiang@localhost server]$ pwd
/opt/work/htdocs/swoole_mooc/demo/server
創(chuàng)建tcp服務(wù)端文件
[zhengzongqiang@localhost server]$ sudo vim tcp.php
打開文檔相關(guān)說明剃执,并認(rèn)真閱讀(我必須說明:開源的框架誓禁,掙點(diǎn)廣告費(fèi)我是支持的;我的觀點(diǎn)跟我的馬賽克并不沖突)
文檔還是好東西肾档,一定要借鑒(我有認(rèn)真閱讀的摹恰,并且為了方便自己看效果有小的改動)
[zhengzongqiang@localhost server]$ cat tcp.php
<?php
//創(chuàng)建Server對象,監(jiān)聽 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set([
'worker_num' => 4, // worker 進(jìn)程數(shù)怒见,cpu的1-4倍
'max_request'=> 10000
]);
// 命令行查看server開啟的worker數(shù)
// ps aft | grep swoole_tcp_server.php
//監(jiān)聽連接進(jìn)入事件
$serv->on('connect', function ($serv, $fd, $reactor_id) {
echo "Client: {$reactor_id} - {$fd} - Connect.\n";
});
//監(jiān)聽數(shù)據(jù)接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
$serv->send($fd, "Server: " . 'reactor_id:'. $reactor_id . ' fd:' . $fd . ' data:' . $data."\n");
});
//監(jiān)聽連接關(guān)閉事件
$serv->on('close', function ($serv, $fd) {
echo "Client: {$fd} - Close.\n";
});
//啟動服務(wù)器
$serv->start();
于是以上代碼片段就被借鑒(ban)到了我們剛剛創(chuàng)建的tcp.php俗慈。
保存退出后,執(zhí)行此文件開啟tcp服務(wù)速种。
文檔同樣貼心的告訴我們?nèi)绾悟?yàn)證姜盈,在新的會話中使用telnet連接服務(wù):
[zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
當(dāng)使用telnet工具連接之后,服務(wù)端便處罰connect事件配阵,并打印1號客戶已經(jīng)連接
[zhengzongqiang@localhost server]$ php tcp.php
Client: 0 - 1 - Connect.
在客戶端發(fā)送消息hello馏颂,可以接收到server端的ack
[zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
Server: reactor_id:0 fd:1 data:hello
創(chuàng)建tcp客戶端文件 tcp.php
進(jìn)入客戶端目錄
[zhengzongqiang@localhost client]$
/opt/work/htdocs/swoole_mooc/demo/client
創(chuàng)建tcp.php文件
[zhengzongqiang@localhost client]$ sudo vim tcp.php
當(dāng)然,如你所想棋傍,文檔中有值得我們借鑒的東西(這次只是看了文檔救拉,但為了實(shí)現(xiàn)telnet的效果,這里使用php cli常量)
[zhengzongqiang@localhost client]$ cat tcp.php
<?php
// 連接swoole tcp server
$client = new swoole_client(SWOOLE_SOCK_TCP);
if(!$client->connect("127.0.0.1",9501)){
echo "連接失敗";
exit;
}
// php cli常量:STDIN:cli輸入 STDOUT:cli輸出
fwrite(STDOUT,"請輸入消息");
// 接收用戶輸入
$msg = trim(fgets(STDIN));
// 發(fā)送消息給 tcp server,返回值為發(fā)送的信息長度
$send = $client->send($msg);
if($send){
echo 'send'. $send."\n";
}
// 接受來自 server 的數(shù)據(jù)
$result = $client->recv();
echo 'recv:'. $result."\n";
這時需要打開兩個會話窗口瘫拣,一個執(zhí)行server端程序文件亿絮,一個執(zhí)行client端程序文件,執(zhí)行client端程序文件后麸拄,server顯示1號客戶端連接派昧。
// server
[zhengzongqiang@localhost server]$ php tcp.php
Client: 0 - 1 - Connect.
在客戶端輸入hello,可接收到server端的回復(fù)
[zhengzongqiang@localhost client]$ php tcp.php
請輸入消息hello
send5
recv:Server: reactor_id:0 fd:1 data:hello
[zhengzongqiang@localhost client]$
一個小技巧
查看server端設(shè)置的worker數(shù)量,通過以下命令可以看到拢切,我們設(shè)置的worker_num為4蒂萎。
[zhengzongqiang@localhost client]$ ps aft | grep tcp.php
7353 pts/3 S+ 0:00 \_ grep --color=auto tcp.php
7281 pts/0 Sl+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7282 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7284 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7285 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7286 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7287 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
通過以上學(xué)習(xí),tcp服務(wù)入門淮椰,會看文檔五慈,UDP也就會了。你會發(fā)現(xiàn)Swoole沒那么神秘主穗;通過后續(xù)學(xué)習(xí)你會發(fā)現(xiàn)泻拦,能夠準(zhǔn)確的形容Swoole的詞,應(yīng)該是‘酷’忽媒!