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

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

  首先介绍一个概念: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:

  •  
    • user@example.com
    • user@example.com/home
    • example.com

  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是:"xxx@gmail.com/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();
  }
  }
});
posted on 2011-05-24 21:17  Jacob.coding  阅读(3826)  评论(0)    收藏  举报