2011-05-18 2 views
2

J'essaie d'utiliser Smack pour transférer un fichier entre deux PC connectés sur le même serveur XMPP, mais j'ai une erreur bizarre.Le transfert de fichiers en utilisant Smack ne fonctionne pas

Pour résumer, le PC de destination a un FileTransferListener enregistré, comme ceci:

ftm.addFileTransferListener(new FileTransferListener() { 
    @Override 
    public void fileTransferRequest(FileTransferRequest request) { 
    System.out.println("Request received"); 
    if (true) // Check to see if the request should be accepted 
    { 
     // Accept it 
     System.out.println("Entering FTListener because of FTRequest"); 
     IncomingFileTransfer transfer = request.accept(); 
     String id = request.getDescription(); 
     String path = savePoint + System.getProperty("file.separator") + request.getFileName(); 

     try 
     { 
     System.out.println("Receiving..."); 
     transfer.recieveFile(new File(path)); 
     // Information put in HashMap for later retrieval 
     System.out.println("IM - putting in path (" + id + "," + path + ")"); 
     paths.put(id, path); 
     } catch (XMPPException e) { 
     logger.error("Error getting the VM file: " + e.getMessage()); 
     } 
    } 
    else 
    { 
     // Reject it 
     request.reject(); 
     logger.info("VM file transfer rejected"); 
    } 
    } 
}); 

Le PC source utilise un OutgoingFileTransfer comme ceci:

try 
{ 
    String nick = destHost + "@" + this.conn.getServer() + "/Smack"; 
    //destHost = destination host name, conn = XMPP connection 
    System.out.println("OFT to " + nick); 
    OutgoingFileTransfer.setResponseTimeout(10000); 
    OutgoingFileTransfer oft = ftm.createOutgoingFileTransfer(nick); 
    oft.sendFile(f, name); //f = file to send, name = a message 
    while (!oft.isDone()) 
    { 
    if (oft.getStatus().equals(Status.error)) 
    { 
     System.out.println("ERROR!!! " + oft.getError()); 
     oft.cancel(); 
     return false; 
    } 

    System.out.println(oft.getStatus()); 
    System.out.println(oft.getProgress()); 
    System.out.println("5 sec sleep"); 
    Thread.sleep(5000); 
    } 

    if (oft.getStatus().equals(Status.complete)) 
    { 
    System.out.println("Transfer done"); 
    return true; 
    } 

    if (oft.getStatus().equals(Status.error)) 
    System.out.println("Transfer failed: " + oft.getError()); 
    return false; 

} catch (XMPPException e) { 
    System.out.println("Error sending VM image file with the FTM : " + e.getMessage()); 
    return false; 

} catch (InterruptedException e) { 
    System.err.println("Error sleeping during OFT : " + e.getMessage()); 
    return false; 
} 

Lorsque je tente d'envoyer un fichier, le le transfert de fichier sortant commence, et le PC de destination reçoit la demande, mais le PC source ne peut pas aller plus loin que la négociation de transfert.

Cela se voit dans la source sortie PC ...

Initial

0.0

2 sec sleep

Negotiating Transfer

0.0

2 sec sleep

Negotiating Stream

0.0

2 sec sleep

Transfer failed: null

Je suis vraiment ennuyé parce que je ne suis même pas un message d'erreur appropriée, donc je ne sais pas vraiment ce qui a mal tourné.

Est-ce que cela est déjà arrivé à quelqu'un d'autre?

+0

je suis confronté au même problème dans smack 4.2.0. Je n'arrive pas à comprendre le travail. Je suis coincé sur Negotiating Stream. –

Répondre

3

On dirait que vous rencontrez un known issue dans Smack qui devrait être corrigé dans la prochaine version.

Mise à jour: Ceci est maintenant corrigé et sera dans la version 3.2.1.

1

Les bytestreams XMPP sont bien spécifiés, mais constituent un sujet plutôt complexe, car il existe plusieurs façons d'établir un tel flux. Votre code a l'air juste sur un examen rapide. Maintenant, l'étape suivante consisterait à analyser les strophes XMPP envoyées entre les deux clients et le serveur. Cela devrait vous donner un indice sur la cause de l'erreur. Assurez-vous également d'utiliser smack 3.2.0 qui a le support IBB, ce qui devrait augmenter les chances d'un transfert de fichier réussi via XMPP.

+0

J'ai réussi à envoyer le fichier d'un client en utilisant mon code à un client utilisant Pidgin. Demain, je vais devoir essayer d'analyser le trafic entre deux clients avec mon code. – Lupuss

+0

J'ai essayé d'envoyer un fichier à mon application en utilisant pidgin. Je reçois l'erreur: "Impossible d'ouvrir intestream bytes". Dans les strophes, l'erreur XMPP implicite est le numéro 404, "Impossible d'établir une socket avec un hôte fourni". Se pourrait-il que l'application s'exécute dans une machine virtuelle NATed? – Lupuss

+0

Les bandes IBB (In-Band Bytestreams) sont des sauvegardes NAT, car elles utilisent la connexion existante de XMPP utilisée pour les messages XMPP pour le transport de données. Une transcription complète des strophes qui sont impliquées dans le transfert de fichiers sur un pastebin serait utile. IBB et le message "Impossible d'établir une socket avec un hôte fourni" ne correspondent pas vraiment. – Flow

Questions connexes