簡單tcp 客戶端實現
server.php
如果想看是否真的啟動了配置中的最大連線數 可以執行以下命令檢視<?php
$serv
=new
swoole_server
('0.0.0.0'
,9906);
$serv
->
set(
['worker_num'
=>4,
// 最大連線
'max_request'
=>
10000
,// worker程序數
'log_level'
=>
swoole_log_error
,// 日誌等級 關閉開啟debug
'trace_flags'
=>
swoole_trace_server
,// 日誌等級 關閉開啟debug])
;// 客戶端鏈結觸發
$serv
->on(
'connect'
,function
($serv
,$fd
,$reactorid
) -
- connect.\n";}
);// 接收函式
$serv
->on(
'receive'
,function
($serv
,$fd
,$reactorid
,$data
) -
- ");
// $serv->close($fd);})
;$serv
->on(
'close'
,function
($serv
,$fd))
;//啟動伺服器
$serv
->
start()
;
ps aft | grep server.php
名稱
引數值描述
例最大連線
max_conn
此引數用來設定server最大允許維持多少個tcp連線。超過此數量後,新進入的連線將被拒絕。此引數不要調整的過大,根據機器記憶體的實際情況來設定。底層會根據此數值一次性分配一塊大記憶體來儲存connection資訊
max_conn => 10000
守護程序化
daemonize
加入此引數後,執行php server.php將轉入後台作為守護程序執行
daemonize => 1
reactor執行緒數
reactor_num
通過此引數來調節reactor執行緒的數量,以充分利用多核,reactor_num和預設設定為cpu核數
reactor_num => 2
worker程序數
worker_num
設定啟動的worker程序數量。swoole採用固定worker程序的模式。全非同步非阻塞伺服器 worker_num配置為cpu核數的1-4倍即可。同步阻塞伺服器,worker_num配置為100或者更高,具體要看每次請求處理的耗時和作業系統負載狀況。當設定的worker程序數小於reactor執行緒數時,會自動調低reactor執行緒的數量
worker_num => 4
max_request
max_request
此引數表示worker程序在處理完n次請求後結束執行。manager會重新建立乙個worker程序。此選項用來防止worker程序記憶體溢位。php**也可以使用memory_get_usage來檢測程序的記憶體占用情況,發現接近memory_limit時,呼叫exit()退出程序。manager程序會**此程序,然後重新啟動乙個新的worker程序。onconnect/onclose不增加計數
設定為0表示不自動重啟。在worker程序中需要儲存連線資訊的服務,需要設定為0.
max_request => 2000
listen佇列長度
backlog
此引數將決定最多同時有多少個待accept的連線,swoole本身accept效率是很高的,基本上不會出現大量排隊情況。
backlog => 128
cpu親和設定
open_cpu_affinity
啟用cpu親和設定
open_cpu_affinity => 1
tcp_nodelay啟用
open_tcp_nodelay
啟用tcp_nodelay
open_tcp_nodelay => 1
tcp_defer_accept
tcp_defer_accept
此引數設定乙個秒數,當客戶端連線連線到伺服器時,在約定秒數內並不會觸發accept,直到有資料傳送,或者超時時才會觸發。
tcp_defer_accept => 5
日誌檔案路徑
log_file
指定swoole錯誤日誌檔案。在swoole執行期發生的異常資訊會記錄到這個檔案中。缺省會列印到螢幕。
log_file => 『/data/log/swoole.log』
資料buffer
open_eof_check
package_eof
buffer主要是用於檢測資料是否完整,如果不完整swoole會繼續等待新的資料到來。直到收到完整的乙個請求,才會一次性傳送給worker程序。這時onreceive會收到乙個超過sw_buffer_size,小於$serv->setting[『package_max_length』]的資料。目前僅提供了eof檢測、固定包頭長度檢測2種buffer模式。open_eof_check => true開啟buffer package_eof => 「\r\n\r\n」 設定eof
open_eof_check => true package_eof => 「\r\n\r\n」
心跳檢測機制
heartbeat_check_interval
heartbeat_idle_time
heartbeat_check_interval 每隔多少秒檢測一次,單位秒,swoole會輪詢所有tcp連線,將超過心跳時間的連線關閉掉。heartbeat_idle_time tcp連線的最大閒置時間,單位s , 如果某fd最後一次發包距離現在的時間超過heartbeat_idle_time會把這個連線關閉。heartbeat_idle_time必須大於或等於heartbeat_check_interval
heartbeat_check_interval => 30 heartbeat_idle_time => 60
worker程序資料報分配模式
dispatch_mode
1平均分配,2按fd取模固定分配,3搶占式分配,預設為取模(dispatch=2)
dispatch_mode=>1
client.php
<?php
$client
=new
swoole_client
(swoole_sock_tcp);
// 同步阻塞
$ret
=$client
->
connect
('127.0.0.1'
,9906);
if(!$ret)"
);}fwrite
(stdout
,'請輸入:');
$msg
=trim
(fgets
(stdin))
;$client
->
send
($msg);
$result
=$client
->
recv()
;echo
$result
;$client
->
close()
;
C 服務端與客戶端
c 服務端與客戶端連線實現的由來 那麼既然乙個伺服器端口可以應對多個客戶端連線,那麼接下來我們就看一下,如何讓多個客戶端與服務端連線。如同我們上面所說的,乙個tcpclient就是乙個socket,所以我們只要建立多個tcpclient,然後再呼叫connect 方法就可以了 c 服務端與客戶端連線...
服務端與客戶端互動
搭建伺服器 伺服器端 using system.net.sockets using system.net using system.io using system.text namespace sockerservice endpoint point new ipendpoint ipaddress...
NodeJS TCP客戶端與服務端
server.js var net require net 載入網路模組 var clients 0 建立id來引用連線的每乙個客戶端 var server net.createserver function client client.write welcome client clientid 使...