swoole學習手記(二)建立服務器(上)

目錄php

持續更新中。。。html

1.建立tcp服務器

先照着文檔建立一個tcp服務器react

<?php
//建立服務器 參數分別是 
//監聽的地址 127.0.0.1 表示監聽本機,0.0.0.0表示監聽全部地址
//9501 端口號 這個你隨便定都行只要沒被佔用過(netstat -an | grep 查看端口使用狀況) 若是被佔用就使用 命令 kill殺死進程
//SWOOLE_PROCESS 爲多進程模式,通常這裏不傳值,默認爲多進程 SWOOLE_BASE爲基本模式 
//SWOOLE_SOCK_TCP 也就是說建立tcp服務器 
$serv=new swoole_server('127.0.0.1','9501',SWOOLE_PROCESS,SWOOLE_SOCK_TCP);

//服務器設置參數
$serv->set([
'worker_num'=>4,  //worker進程數 通常爲cpu數的 1-4倍
'max_request'=>10000, //worker進程在處理完n次請求後結束運行重建一個
]);
//這裏
//固然還有不少設置的參數 文檔傳送門:https://wiki.swoole.com/wiki/page/13.html

//監聽鏈接進入事件(這裏是一個閉包寫法)鏈接後調用的函數
//$fd客戶端鏈接的惟一標示
//$reactor_id 線程id 是一個自增數字,範圍是1 ~ 1600萬,fd超過1600萬後會自動從1開始進行復用
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$reactor_id} - {$fd}-Connect.\n";
});

//監聽數據接收事件
//$data就是接收的數據
$serv->on('receive', function ($serv, $fd, $reactor_id, $data)) {
    $serv->send($fd, "Server: ".$data);
    echo '收到了數據'.$data;
});

//監聽鏈接關閉事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close".$fd."\n";
});

//啓動服務器
$serv->start();

ok咱們測試一下 php tcp.php 打開tcp服務器(若是端口被佔用,則殺死佔用端口的進程,關掉使用ctrl+c,掛起使用ctrl+z)
clipboard.pngsegmentfault

再打開telnet(咱們要再打開一個終端)測試一下是否是成功了,隨便輸入eqqeq服務器

clipboard.png

再看看tcp服務器微信

clipboard.png

看到這裏咱們整理一下思路:
建立了tcp服務器->telnet鏈接服務器->tcp執行connect->telnent發送信息->tcp監聽到receive事件->telnent斷開->tcp 監聽到close事件swoole


疑問
1.server與telnet的關係
服務器與客服端的關係,一個server對應多個telnet閉包

2.$serv->send($fd, "Server: ".$data); 和 直接輸出 echo 有什麼區別呀?異步

send是發送數據 給 對方(鏈接我服務器的) ,好比你用微信和你的朋友聊天,你發了一個server: ".$data,那麼就至關於你把消息發給了你朋友, 而echo的話是輸出內容,只給本身。tcp

3.線程與進程是什麼鬼?
至關於一個工廠(CPU)裏的多個車間(進程)
一個車間(進程)有不少個工人(線程)
車間裏面有廁所(共享內存),工人均可以共用,可是你得等工人用完才能夠進去

咱們平時使用php是單進程,那麼大的工廠就用了一個車間效率固然慢,
因此咱們要多個車間(多進程),多個員工(線程),來提升效率

注意:
每次修改服務器腳本文件後都要
關閉進程再從新打開纔會生效

2.建立udp服務器

1.TCP核ucp都是傳輸層協議,可是UDP服務器與TCP服務器不一樣,UDP沒有鏈接的概念,udp消耗資源比較小,可是速度快。啓動Server後,客戶端無需Connect,直接能夠向Server監聽的9502端口發送數據包。

2.udp的建立方式跟tcp很像

//就是把最後一個參數改成 SWOOLE_SOCK_UDP 
$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

3.UDP服務器可使用不用telnet而是用 netcat -u 來鏈接測試
nc安裝:
yum -y install yum -y install nc.x86_64 使用就是直接 nc -u 127.0.0.1 9502

4.完整的實現

//建立Server對象,監聽 127.0.0.1:9502端口,類型爲SWOOLE_SOCK_UDP
$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
 
//udp沒有 $serv->on connect的概念

//監聽數據接收事件
$serv->on('Packet', function ($serv, $data, $clientInfo) {
    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
    var_dump($clientInfo);
});

//啓動服務器
$serv->start();

5.測試,一樣咱們也打開2個終端
udp服務器 這裏咱們打印了$clientInfo

clipboard.png

nc測試服務器

clipboard.png


ok測試沒有問題^-^

思考:tcp與udp都是傳輸層協議的server,那麼基於傳輸層的應用層server又會是怎樣的呢?

若是這篇文章對你有用,能夠點個贊或者是收藏,算是對做者的鼓勵~

文檔地址傳送門:https://wiki.swoole.com/wiki/...
推薦singwa老師的視頻教程:https://coding.imooc.com/clas...

另附上小弟網站。。。www.entercode.cn 推廣一波...

相關文章
相關標籤/搜索