初次接触XMPP(三):实现文件传输

http://www.cnblogs.com/jacob-coding/archive/2011/05/24/2056002.html

文件传输这里我搞了好长时间,只是因为一个小小的点没有注意到,所以写出来能够提醒一下。

  首先介绍一个概念:JID

  An XMPP address (JID). A JID is made up of a node (generally a username), a domain, and a resource. The node and resource are optional; domain is required. In simple ABNF form:

    jid = [ node "@" ] domain [ "/" resource ]

    Some sample JID's:

  Each allowable portion of a JID (node, domain, and resource) must not be more than 1023 bytes in length, resulting in a maximum total size (including the '@' and '/' separators) of 3071 bytes. JID instances are immutable. Multiple threads can act on data represented by JID objects without concern of the data being changed by other threads.

简单地说JID就是一个XMPP实体地址,由三部分组成:域标识符,节点标识符和资源标识符。第一部分和第三部分是可选的。

我在写文件传输时就是因为这个JID卡住了,下面具体说一下我的问题以及文件传输。

复制代码
    
    
    
    
FileTransferManager ftManager = new FileTransferManager(connection); String userID = "xxx"+"@"+"xxx"+"/"+"xxx" ; // 一定注意这里必须是完整JID OutgoingFileTransfer transfer = ftManager.createOutgoingFileTransfer(userID); transfer.sendFile( new File( " xxxx " ), " xxx " ); while ( ! transfer.isDone()) {   if (transfer.getStatus() == FileTransfer.Status.in_progress)   {     // 可以调用transfer.getProgress();获得传输的进度   } }
复制代码

我就是因为userID用的不是完整的JID而出错的,找了很长时间才发现错误。没有认真读开发文档,里面有明确说明:

   public OutgoingFileTransfer createOutgoingFileTransfer(java.lang.String userID)

    userID - The fully qualified jabber ID with resource of the user to send the file to.

  

Spark的完整JID是:"xxx@xxx/spark"

  GTalk的完整JID是:"[email protected]/Talk.v104ACDADFE8",每次的资源标识符是不一样的,而且GTalk不和你写的IM客户端传文件,GTalk只和GTalk传文件,不带我玩,反正目前我没发现怎么和GTalk互传文件。

  怎么设置自己IM客户端的resource呢?

     在每次connection.login的时候可以设置。

  public void login(java.lang.String username,

                  java.lang.String password,

                  java.lang.String resource)

  默认的resource应该是Smack。

  所以我建议在每次传文件的时候:

    
    
    
    
Presence presence = connection.getRoster().getPresence( " xxx " ); // 获得用户状态 if (presence.getType() == Presence.Type.available) { String JID = presence.getFrom(); // 这里获得的是完整JID
  //然后在进行文件传输。 }

  文件的接收,应该没什么问题。

复制代码
    
    
    
    
ftManager.addFileTransferListener(
    new FileTransferListener() 
  {   @Override public void fileTransferRequest(FileTransferRequest request) 
     {   IncomingFileTransfer transfer = request.accept();    try   {   transfer.recieveFile( new File( " xxx " ));   }    catch (XMPPException e)   {   e.printStackTrace();   }   } });
复制代码


你可能感兴趣的:(初次接触XMPP(三):实现文件传输)