2010-12-01 14 views
6

Estoy tratando de implementar FTPClient usando QT Network.Problema al desarrollar FTPClient usando Qt

¿Cómo puedo manejar casos excepcionales, como durante la descarga, el cable de red está desconectado, no se ha desconectado la conexión a Internet, etc.?

¿Cómo puede mi FTPClient llegar a conocer este tipo de evento y existe ese tipo de notificación disponible?

He intentado utilizar señales como done (bool), ommandFinished (int id, bool error) pero no recibo ningún tipo de señal.

Respuesta

4

Parece que usa QFtp, que es obsoleto. Debería utilizar QNetworkReply (y QNetworkAccessManager), que tiene las señales de finalización() y error(): QNetworkReply documentation.

+0

Estoy usando la biblioteca Qt 4.7. Hace la descarga del archivo, pero no estoy recibiendo tales eventos. – Ashish

+0

Aún así, QFtp es obsoleto y posiblemente con errores. ¿Has probado con QNetworkReply? –

+0

No creo que decir a Ashish que utilice QNAM para un cliente de FTP sea correcto. QNAM sirve como una capa de abstracción para las aplicaciones que necesitan tratar con diferentes protocolos. Un cliente de FTP, por el contrario, debe hablar solo del protocolo de FTP por diseño y es probable que necesite características más sofisticadas que las expuestas en la interfaz de QNAM universal. –

1

Para gestionar las excepciones de red al utilizar QFtp, puede escuchar la señal stateChanged(). Si el estado se vuelve de cierre o desconectado, puede verificar qué es el error().

Acerca de QNAM frente a QFtp: QNAM es la API más nueva y más limpia, pero ambas están destinadas a funcionar y son oficialmente compatibles. En API, QFtp usa el viejo patrón de ID de comando (cada comando devuelve un id de comando), lo que requiere que hagamos un seguimiento de los comandos (por ejemplo, para averiguar para qué comando se generó una señal). Encuentro que el patrón api de QNAM es mucho mejor porque sus comandos devuelven un objeto QNetworkReply que a su vez emite señales. Pero entonces, la API de QNAM no parece ajustada para ftp y maneja http/s (como no deletion of files over ftp), así que tal vez sea bueno seguir con QFtp por ahora.

0

QNetworkAccessManager, como se indica en los comentarios que no puedo responder, es una utilidad de red básica para las necesidades comunes y no para el acceso de bajo nivel.

hay pocas opciones que puede hacer: protocolo

1) Implementar FTP a sí mismo y todas las características que desea realizar con QTcpSocket y el servidor.

2) Utilice QNetworkAccessManager y espero que pueda solucionar todos los problemas con él.

Las ventajas de cada enfoque deben ser claras, pero recuerde que Qt no es solo un conjunto de herramientas para la creación de clientes FTP.

3

¿Ha intentado crear una SLOT personalizada y conectarla al error SIGNAL de QNetworkReply ?

A continuación, puede inspeccionar el argumento para determinar el error y decidir cómo desea tratarlo.

QNetworkReply::NoError 0 no error condition. Note: When the HTTP protocol returns a redirect no error will be reported. You can check if there is a redirect with the QNetworkRequest::RedirectionTargetAttribute attribute. 
QNetworkReply::ConnectionRefusedError 1 the remote server refused the connection (the server is not accepting requests) 
QNetworkReply::RemoteHostClosedError 2 the remote server closed the connection prematurely, before the entire reply was received and processed 
QNetworkReply::HostNotFoundError 3 the remote host name was not found (invalid hostname) 
QNetworkReply::TimeoutError 4 the connection to the remote server timed out 
QNetworkReply::OperationCanceledError 5 the operation was canceled via calls to abort() or close() before it was finished. 
QNetworkReply::SslHandshakeFailedError 6 the SSL/TLS handshake failed and the encrypted channel could not be established. The sslErrors() signal should have been emitted. 
QNetworkReply::TemporaryNetworkFailureError 7 the connection was broken due to disconnection from the network, however the system has initiated roaming to another access point. The request should be resubmitted and will be processed as soon as the connection is re-established. 
QNetworkReply::ProxyConnectionRefusedError 101 the connection to the proxy server was refused (the proxy server is not accepting requests) 
QNetworkReply::ProxyConnectionClosedError 102 the proxy server closed the connection prematurely, before the entire reply was received and processed 
QNetworkReply::ProxyNotFoundError 103 the proxy host name was not found (invalid proxy hostname) 
QNetworkReply::ProxyTimeoutError 104 the connection to the proxy timed out or the proxy did not reply in time to the request sent 
QNetworkReply::ProxyAuthenticationRequiredError 105 the proxy requires authentication in order to honour the request but did not accept any credentials offered (if any) 
QNetworkReply::ContentAccessDenied 201 the access to the remote content was denied (similar to HTTP error 401) 
QNetworkReply::ContentOperationNotPermittedError 202 the operation requested on the remote content is not permitted 
QNetworkReply::ContentNotFoundError 203 the remote content was not found at the server (similar to HTTP error 404) 
QNetworkReply::AuthenticationRequiredError 204 the remote server requires authentication to serve the content but the credentials provided were not accepted (if any) 
QNetworkReply::ContentReSendError 205 the request needed to be sent again, but this failed for example because the upload data could not be read a second time. 
QNetworkReply::ProtocolUnknownError 301 the Network Access API cannot honor the request because the protocol is not known 
QNetworkReply::ProtocolInvalidOperationError 302 the requested operation is invalid for this protocol 
QNetworkReply::UnknownNetworkError 99 an unknown network-related error was detected 
QNetworkReply::UnknownProxyError 199 an unknown proxy-related error was detected 
QNetworkReply::UnknownContentError 299 an unknown error related to the remote content was detected 
QNetworkReply::ProtocolFailure 399 a breakdown in protocol was detected (parsing error, invalid or unexpected responses, etc.) 

Algunos de estos códigos de error son específicos de HTTP, pero otros son más genéricos.

1

Aquí está un complete example of an QT FTP client, junto con la documentación. Yo recomendaría usar sus envolturas alrededor del QFTP class.

Extracto de errores de manipulación al descargar:

if (ftp->currentCommand() == QFtp::Get) { 
    if (error) { 
     statusLabel->setText(tr("Canceled download of %1.") 
           .arg(file->fileName())); 
     file->close(); 
     file->remove(); 
    } else { 
     statusLabel->setText(tr("Downloaded %1 to current directory.") 
           .arg(file->fileName())); 
     file->close(); 
    } 
    delete file; 
    enableDownloadButton(); 
    progressDialog->hide(); 

Es una demo totalmente funcional, también.Aquí hay una captura de pantalla:

alt text

+0

ya sé que está funcionando, pero no da ningún evento cuando la red se deshabilita. – Ashish

+0

cuando la red está desconectada, el cliente debe creer que la descarga está "lista" y luego se activará este código. ¿No es eso lo que está pasando? – ine

Cuestiones relacionadas