在XMPP通讯开发-好友通信实现 中我们实现了好友间的信息通信,在这里我们实现好友间文件的传输,这部分内容可以查看smack_3_3_0\documentation\extensions\index.html,文件传输我们主要用到的是FileTransferManager和OutgoingFileTransfer,当然我们可以发送文件也可以接收文件,要实现接收文件我们需要FileTransferManager添加一个监听事件FileTransferListener,来监听好友发送的文件事件,首先我们实现如何发送文件,代码如下:
private void sendFile(File file, String fileName){
try {
if(JUID == null)
JUID = conn.getRoster().getEntry(frindsXmppAddress).getUser();
transfer = fileManager.createOutgoingFileTransfer(frindsXmppAddress+"/Spark 2.6.3");
transfer.sendFile(file, fileName);
while(!transfer.isDone()){
if(transfer.getStatus().equals(Status.error)){
System.out.println("ERROR!!! " + transfer.getError());
}else{
System.out.println(transfer.getStatus()+"进度 "+transfer.getProgress());
}
Thread.sleep(1000);
}
} catch (Exception ex) {
ex.printStackTrace();
}finally{
if(transfer.getStatus().equals(Status.error)){
ChatMessage.append(dateUtils.getHM()+" 自己: 传输出错"+"\n");
}else if(transfer.getStatus().equals(Status.complete)){
ChatMessage.append(dateUtils.getHM()+" 自己: "+fileName+" 传输完成\n");
}else if(transfer.getStatus().equals(Status.cancelled)){
ChatMessage.append(dateUtils.getHM()+frindsXmppAddress+" "+fileName+" 传输取消\n");
}
}
}
这里要注意的就是
transfer = fileManager.createOutgoingFileTransfer(frindsXmppAddress+"/Spark 2.6.3");
函数的原型public OutgoingFileTransfer createOutgoingFileTransfer(String userID),其中的userID包含三部分,. A fully-qualified jabber ID consists of a node, a domain, and a resource, the user must be connected to the resource in order to be able to recieve the file transfer。其实也可以说两部分就是xmpp地址+对方客户端,一定要包含这几个,不然会报错的,效果图如下:
这个是发送文件,接收文件如何进行呢,代码如下:
private void initTransFile(){
fileManager = new FileTransferManager(conn);
fileManager.addFileTransferListener(new FileTransferListener(){
@Override
public void fileTransferRequest(FileTransferRequest request) {
int respone = JOptionPane.showConfirmDialog(null, frindsXmppAddress+"发送文件"+request.getFileName(), "发送文件", JOptionPane.YES_NO_OPTION);
if(respone == 0){
try {
// Accept it
IncomingFileTransfer transfer = request.accept();
transfer.recieveFile(new File(request.getFileName()));
} catch (XMPPException ex) {
Logger.getLogger(ChatPanel.class.getName()).log(Level.SEVERE, null, ex);
}
}else{
request.reject();
}
}
});
}
我们注册FileTransferListener进行监听,效果图如下:
源码项目:https://github.com/jwzhangjie/IChat_PC.git