|
|
@@ -125,75 +125,4 @@ class AsyncTcpConnection extends TcpConnection
|
|
|
$this->emitError(WORKERMAN_CONNECT_FAIL, 'connect fail');
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * 发送数据给对方
|
|
|
- * @param string $send_buffer
|
|
|
- * @return void|boolean
|
|
|
- */
|
|
|
- public function send($send_buffer)
|
|
|
- {
|
|
|
- // 如果有设置协议,则用协议编码
|
|
|
- if($this->protocol)
|
|
|
- {
|
|
|
- $parser = $this->protocol;
|
|
|
- $send_buffer = $parser::encode($send_buffer, $this);
|
|
|
- }
|
|
|
-
|
|
|
- // 如果当前状态是连接中,则把数据放入发送缓冲区
|
|
|
- if($this->_status === self::STATUS_CONNECTING)
|
|
|
- {
|
|
|
- $this->_sendBuffer .= $send_buffer;
|
|
|
- return null;
|
|
|
- }
|
|
|
- // 如果当前连接是关闭中,则返回false
|
|
|
- elseif($this->_status == self::STATUS_CLOSED)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 如果发送缓冲区无数据,则尝试直接发送
|
|
|
- if($this->_sendBuffer === '')
|
|
|
- {
|
|
|
- // 直接发送,得到已经发送(写入socket写缓冲区)的字节数
|
|
|
- $len = @fwrite($this->_socket, $send_buffer);
|
|
|
- // 如果已经发送出去的长度刚好为要发送数据的长度,则说明数据发送成功
|
|
|
- if($len === strlen($send_buffer))
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // 数据只发送了一部分,则将剩余的数据放入发送缓冲区
|
|
|
- if($len > 0)
|
|
|
- {
|
|
|
- $this->_sendBuffer = substr($send_buffer, $len);
|
|
|
- }
|
|
|
- // 发送出现异常
|
|
|
- else
|
|
|
- {
|
|
|
- // 如果连接关闭
|
|
|
- if(feof($this->_socket))
|
|
|
- {
|
|
|
- // status命令 统计发送失败次数
|
|
|
- self::$statistics['send_fail']++;
|
|
|
- // 如果有设置失败回到,则执行
|
|
|
- if($this->onError)
|
|
|
- {
|
|
|
- call_user_func($this->onError, $this, WORKERMAN_SEND_FAIL, 'client close');
|
|
|
- }
|
|
|
- // 销毁本实例
|
|
|
- $this->destroy();
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 连接未关闭,则将整个数据放入发送缓冲区
|
|
|
- $this->_sendBuffer = $send_buffer;
|
|
|
- }
|
|
|
- // 监听可写事件,将发送缓冲区的数据发送给对方(写到socket发送缓冲区)
|
|
|
- Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite'));
|
|
|
- return null;
|
|
|
- }
|
|
|
- // 发送缓冲区有数据,则直接将数据放入发送缓冲区
|
|
|
- else
|
|
|
- {
|
|
|
- $this->_sendBuffer .= $send_buffer;
|
|
|
- }
|
|
|
- }
|
|
|
}
|