看聊天室的代碼的時(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)聽(tīng)中,等待Select::Loop, 。
問(wèn)題就是:
此時(shí)對(duì)于這條連接來(lái)說(shuō),stream_select 什么時(shí)候才能監(jiān)聽(tīng)到?且剛剛send中沒(méi)有寫(xiě)入socket的數(shù)據(jù)是從哪里開(kāi)始寫(xiě)進(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ō)的話(huà),當(dāng)客戶(hù)端連接建立成功之后返回的socket,加入到監(jiān)聽(tīng)之后會(huì)被stream_select監(jiān)聽(tīng)到可寫(xiě),之后就按綁定的handler去處理就能夠?qū)?shù)據(jù)發(fā)送出去了,恩,應(yīng)該是這樣子。