看聊天室的代碼的時(shí)候有點(diǎn)疑惑:
// 創(chuàng)建一個(gè) 異步的tcp連接
// 請(qǐng)查看BusinessWorker::tryToConnectGateway方法
$gateway_connection = new AsyncTcpConnection("GatewayProtocol://$addr");
// 然后發(fā)送一些數(shù)據(jù)
// 請(qǐng)查看BusinessWorker::tryToConnectGateway方法
$gateway_connection->send($gateway_data);
$gateway_connection->connect();
}
由于AsyncTcpConnection的初始status狀態(tài)都是connecting狀態(tài),所以send的時(shí)候都會(huì)先直接把buffer先存起來(lái),然后直接return ,進(jìn)入到connect方法,connect方法則stream_socket_client連接服務(wù)端,同時(shí)將連接成功后的socket放入全局監(jiān)聽中,等待Select::Loop, 。
問(wèn)題就是:
此時(shí)對(duì)于這條連接來(lái)說(shuō),stream_select 什么時(shí)候才能監(jiān)聽到?且剛剛send中沒有寫入socket的數(shù)據(jù)是從哪里開始寫進(jìn)去的呢?
(新手,問(wèn)題若太簡(jiǎn)單,請(qǐng)勿噴。)
下面是 AsyncTcpConnection::$connect的代碼:
public function connect()
{
// Open socket connection asynchronously.
$this->_socket = stream_socket_client("tcp://{$this->_remoteAddress}", $errno, $errstr, 0,
STREAM_CLIENT_ASYNC_CONNECT);
// If failed attempt to emit onError callback.
if (!$this->_socket) {
$this->_status = self::STATUS_CLOSED;
$this->emitError(WORKERMAN_CONNECT_FAIL, $errstr);
return;
}
// Add socket to global event loop waiting connection is successfully established or faild.
Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'checkConnection'));
}
http://wenda.workerman.net/?/question/30
按帖里面說(shuō)的話,當(dāng)客戶端連接建立成功之后返回的socket,加入到監(jiān)聽之后會(huì)被stream_select監(jiān)聽到可寫,之后就按綁定的handler去處理就能夠?qū)?shù)據(jù)發(fā)送出去了,恩,應(yīng)該是這樣子。