public function send($request, $future, $context, $conn)
{
$self = $this;
$timeout = $context->timeout;
if ($timeout > 0) {
$conn->timeoutId = swoole_timer_after($timeout, function () use($self, $future, $conn) {
$future->reject(new TimeoutException('timeout'));
if ($conn->isConnected()) {
$conn->close();
}
});
}
$conn->onreceive = function ($conn, $data) use($self, $future) {
$self->clean($conn);
$self->sendNext($conn);
$future->resolve($data);
};
$conn->onclose = function ($conn) use($self, $future) {
$self->clean($conn);
if ($conn->errCode !== 0) {
$future->reject(new Exception(socket_strerror($conn->errCode)));
} else {
$future->reject(new Exception('The server is closed.'));
}
$self->size--;
};
$header = pack('N', strlen($request));
$conn->send($header);
$conn->send($request);
}