Server端
介紹
可以查看代碼的註釋
面向過程實現
<?php
/**
* User: sHuXnHs <[email protected]>
* Date: 19-7-12
* Time: 12:34
*/
//創建Server對象,監聽 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
//
$serv->set([
'worker_num' => '8', // worker進程數
'max_conn' => '1000', // 最大連接數
'daemonize' => '1', // 開啓轉入後臺守護進程運行
'reactor_num' => '8', // 線程數量
'max_request' => '1000', // 最大請求數,表示worker進程在處理n次請求後結束運行,設置爲0表示不自動重啓
'log_file' => '/var/log/swoole.log', // 指定swoole錯誤日誌文件ao
'heartbeat_check_interval' => 30 , // 每隔多少秒檢測一次,swoole會輪詢所有TCP請求,超過心跳時間關閉,單位秒
'heartbeat_idle_time' => 60 // TCP連接最大閒置時間,單位秒
]);
//監聽連接進入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client:".$fd." 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
/**
* User: sHuXnHs <[email protected]>
* Date: 19-7-9
* Time: 11:47
*/
class TCP{
private $sock_type = SWOOLE_SOCK_TCP;
protected $config = [
'worker_num' => '8', // worker進程數
'max_conn' => '1000', // 最大連接數
'daemonize' => '1', // 開啓轉入後臺守護進程運行
'reactor_num' => '8', // 線程數量
'max_request' => '1000', // 最大請求數,表示worker進程在處理n次請求後結束運行,設置爲0表示不自動重啓
'log_file' => '/var/log/swoole.log', // 指定swoole錯誤日誌文件ao
'heartbeat_check_interval' => 30 , // 每隔多少秒檢測一次,swoole會輪詢所有TCP請求,超過心跳時間關閉,單位秒
'heartbeat_idle_time' => 60 // TCP連接最大閒置時間,單位秒
];
public $serv = null;
/**
* TCP constructor.
* @param string $host host
* @param int $port port
* @param int $mode 默認爲多線程模式,還有SWOOLE_BASE基本模式
*/
public function __construct($host = '127.0.0.1', $port = 9501, $mode = SWOOLE_PROCESS)
{
$this->serv = new swoole_server($host, $port, $mode, $this->sock_type);
// 設置運行的各項參數
$this->serv->set($this->config);
$this->serv->on("connect", [$this, 'onConnect']);
$this->serv->on("receive", [$this, 'onReceive']);
$this->serv->on("close", [$this, 'onClose']);
// 開啓事件
$this->serv->start();
}
/**
* @function 監聽連接進入事件
* @param object $serv server對象
* @param int $fd 客戶端唯一標示
* @param int $reactor_id 線程id
*/
public function onConnect($serv, $fd, $reactor_id){
echo "Cilent: ".$fd."-thread".$reactor_id."-connect".PHP_EOL;
}
/**
* @function 監聽事件接受數據
* @param $serv
* @param $fd
* @param $from_id
* @param $data
*/
public function onReceive($serv, $fd, $from_id, $data){
$serv->send($fd, "server:".$data);
}
/**
* @function 監聽連接關閉事件
* @param $serv
* @param $fd
*/
public function onClose($serv, $fd){
echo "Cilent".$fd."close".PHP_EOL;
}
}
$serv = new TCP();
Client端
面向對象式寫法
同樣查看代碼的註釋,默認使用127.0.0.1:9501,socket類型爲SWOOLE_SOCK_TCP
<?php
/**
* 客戶端
* User: sHuXnHs <[email protected]>
* Date: 19-7-12
* Time: 16:47
*/
class Client{
public $client = null;
public $config = [];
/**
* Client constructor.
* @param string $host host
* @param int $port port
* @param int $sock_type socket的類型,默認TCP,也可以UDP:SWOOLE_SOCK_UDP
* @param int $is_async 默認同步阻塞,也可以指定爲SWOOLE_SOCK_ASYNC異步非阻塞或SWOOLE_SOCK_SYNC同步阻塞
* @param bool $is_keep 是否創建長連接
*/
public function __construct($host = '127.0.0.1', $port = 9501, $sock_type = SWOOLE_SOCK_TCP,
$is_async = SWOOLE_SOCK_ASYNC, $is_keep = false)
{
if($is_keep){
$this->client = new Swoole\Client($sock_type | SWOOLE_KEEP, $is_async);
}else{
$this->client = new Swoole\Client($sock_type, $is_async);
}
// 設置運行的各項參數
$this->client->set($this->config);
// 註冊異步事件回調函數
$this->client->on("connect", [$this, 'onConnect']);
$this->client->on("receive", [$this, 'onReceive']);
$this->client->on("error", [$this, 'onError']);
$this->client->on("close", [$this, 'onClose']);
// 開啓事件
$this->client->connect($host, $port);
}
/**
* @function 監聽連接進入事件
* @param object $cli client對象
*/
public function onConnect($cli){
fwrite(STDOUT, "input data to server");
$data = trim(fgets(STDIN));
$cli->send($data);
}
/**
* @function 監聽事件接受數據
* @param object $cli client對象
* @param string $data 接收到的數據
*/
public function onReceive($cli, $data){
echo "Receive data: ".$data.PHP_EOL;
}
/**
* @function 監聽連接關閉事件
* @param object $cli client對象
*/
public function onClose($cli){
echo "Connection close".PHP_EOL;
}
/**
* @function 監聽事件錯誤
* @param object $cli client對象
*/
public function onError($cli){
echo "error".$cli->errCode.PHP_EOL;
}
}
$client = new Client("127.0.0.1","9502", SWOOLE_SOCK_UDP);
面向過程式寫法
<?php
/**
* 同步阻塞客戶端,php-fpm環境下
* User: sHuXnHs <[email protected]>
* Date: 19-7-12
* Time: 16:47
*/
$cilent = new swoole_client(SWOOLE_SOCK_TCP);
try{
$cilent->connect("127.0.0.1",9501,-1);
}catch (Exception $e){
echo $e->getMessage().PHP_EOL;
exit("connect failed. Error: {$cilent->errCode}".PHP_EOL);
}
fwrite(STDOUT, "請輸入");
$msg = trim(fgets(STDIN));
// 發送消息
$cilent->send($msg);
// 接收數據
$result = $cilent->recv();
echo $result.PHP_EOL;
$cilent->close();
<?php
/**
* 異步非阻塞客戶端,只能在Cli命令行環境下運行
* User: sHuXnHs <[email protected]>
* Date: 19-7-12
* Time: 16:47
*/
$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on("connect", function(swoole_client $cli) {
fwrite(STDOUT, "請輸入");
$msg = trim(fgets(STDIN));
$cli->send($msg);
});
$client->on("receive", function(swoole_client $cli, $data){
echo "Receive: $data";
});
$client->on("error", function(swoole_client $cli){
echo "error".PHP_EOL;
});
$client->on("close", function(swoole_client $cli){
echo "Connection close".PHP_EOL;
});
$client->connect('127.0.0.1', 9501);