文件传输这里我搞了好长时间,只是因为一个小小的点没有注意到,所以写出来能够提醒一下。
首先介绍一个概念: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();
}
}
});
浙公网安备 33010602011771号