<?php
use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once './Workerman/Autoloader.php';
//遠程CCS地址
$REAL_CCS_ADDRESS = 'tcp://xx.xx.xx.xx:80';
// 監(jiān)聽本地4237端口
$proxy = new Worker('http://0.0.0.0:4237');
$proxy->onConnect = function($connection)
{
global $REAL_CCS_ADDRESS;
// 異步建立一個到實際ccs服務(wù)器的連接
$connection_to_css = new AsyncTcpConnection($REAL_CCS_ADDRESS);
// ccs連接發(fā)來數(shù)據(jù)時,轉(zhuǎn)發(fā)給對應(yīng)客戶端的連接
$connection_to_css->onMessage = function($connection_to_css, $buffer)use($connection)
{
var_dump($buffer);
$connection->send($buffer);
};
// ccs連接關(guān)閉時,關(guān)閉對應(yīng)的代理到客戶端的連接
$connection_to_css->onClose = function($connection_to_css)use($connection)
{
$connection->close();
};
// ccs連接上發(fā)生錯誤時,關(guān)閉對應(yīng)的代理到客戶端的連接
$connection_to_css->onError = function($connection_to_css)use($connection)
{
$connection->close();
};
// 執(zhí)行異步連接
$connection_to_css->connect();
// 客戶端發(fā)來數(shù)據(jù)時,轉(zhuǎn)發(fā)給對應(yīng)的ccs連接
$connection->onMessage = function($connection, $buffer)use($connection_to_css)
{
$buffer = $_POST;
var_dump($connection_to_css->send($buffer));
};
// 客戶端連接斷開時,斷開對應(yīng)的ccs連接
$connection->onClose = function($connection)use($connection_to_css)
{
$connection_to_css->close();
};
// 客戶端連接發(fā)生錯誤時,斷開對應(yīng)的ccs連接
$connection->onError = function($connection)use($connection_to_css)
{
$connection_to_css->close();
};
};
// 運行worker
Worker::runAll();
workerman提供的網(wǎng)絡(luò)IO接口都是異步的。
返回null 說明發(fā)生了下面兩種情況其中的一種
1、遠程鏈接還沒有連上就開始向遠程鏈接發(fā)送數(shù)據(jù)。
2、由于發(fā)送的數(shù)據(jù)大于socket緩沖區(qū)的大小或者socket緩沖區(qū)已滿導(dǎo)致有部分數(shù)據(jù)未發(fā)送,這時未發(fā)送的數(shù)據(jù)放入待發(fā)送隊列,等待socket緩沖區(qū)有空余位置時再將數(shù)據(jù)放入進去發(fā)送。
如果想得到發(fā)送的確切結(jié)果,那么只能阻塞等待,這樣會導(dǎo)致只要有一個socket慢(鏈接慢或者接收數(shù)據(jù)慢)就會導(dǎo)致整個服務(wù)卡死。
另外也不是你想發(fā)送就能立即發(fā)送的,涉及到網(wǎng)絡(luò)環(huán)境以及者客戶端自身等很多因素。例如網(wǎng)絡(luò)暫時不可用、客戶端bug無法接受數(shù)據(jù)導(dǎo)致對應(yīng)socket緩沖區(qū)一直是滿的等等都。