Swoole TCP服務端與客戶端 持續更新

2021-09-11 04:07:22 字數 4081 閱讀 4793

簡單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_checkpackage_eofbuffer主要是用於檢測資料是否完整,如果不完整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_intervalheartbeat_idle_timeheartbeat_check_interval 每隔多少秒檢測一次,單位秒,swoole會輪詢所有tcp連線,將超過心跳時間的連線關閉掉。heartbeat_idle_time tcp連線的最大閒置時間,單位s , 如果某fd最後一次發包距離現在的時間超過heartbeat_idle_time會把這個連線關閉。heartbeat_idle_time必須大於或等於heartbeat_check_intervalheartbeat_check_interval => 30 heartbeat_idle_time => 60

worker程序資料報分配模式

dispatch_mode1平均分配,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 使...