发送文件须要提供准确的接收放username称(例:user2@192.168.1.100)、本地文件全路径(例:E:\\xxx\\xxx.zip)

接收文件必须声明一个文件监听器用于监听有可能发送过来的文件。

client发送文件代码片断

public void sendFire(XMPPConnection conn,String toUser,String filePath)throws XMPPException{
//conn必须是已经登录了的
//注冊toUser仅仅在一个地方登录过。多处登录有可能会出现接收主收不到请求的问题
FileTransferManager ftm = new FileTransferManager(conn);
/*
* 检查传递的用户是否正确
* toUser="user2@192.168.1.100"
* 192.168.1.100 为openfireserver地址
*/
Presence p = connection.getRoster().getPresence(toUser);
if(p==null){
System.out.println("用户不存在");
return;
}
toUser = p.getFrom();//提取完整的username称
OutgoingFileTransfer oft = ftm.createOutgoingFileTransfer(toUser);

//"get my file"能够是任意字符串,就是一个携带信息
oft.sendFile(new File(filePath), "get my file");
System.out.println("sending file status="+oft.getStatus());
long startTime = -1;
while (!oft.isDone()){
if (oft.getStatus().equals(Status.error)){
System.out.println("error!!!"+oft.getError());
}else{
double progress = oft.getProgress();
if(progress>0.0 && startTime==-1){
startTime = System.currentTimeMillis();
}
progress*=100;
System.out.println("status="+oft.getStatus());
System.out.println("progress="+nf.format(progress)+"%");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("used "+((System.currentTimeMillis()-startTime)/1000)+" seconds ");
}



client接收文件代码片断。接收方的測试程序要注意,測试时不能让程序退出。要不然注冊的监听器也会随着程序的退出而销毁,当然用户也会被登出。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
public void startRecvFileListen(XMPPConnection conn){
//conn必须是已经登录了的
FileTransferManager manager = new FileTransferManager(conn);
//加入文件接收监听器
manager.addFileTransferListener(new FileTransferListener() {
//每次有文件发送过来都会调用些方法
public void fileTransferRequest(FileTransferRequest request) {
//调用request的accetp表示接收文件,也能够调用reject方法拒绝接收
final IncomingFileTransfer inTransfer = request.accept();
try {
System.out.println("接收到文件发送请求。文件名:"+request.getFileName());
//接收到的文件要放在哪里
String filePath = "D:\\datas\\smackclient\\"+request.getFileName();
inTransfer.recieveFile(new File(filePath));
//假设要时时获取文件接收的状态必须在线程中监听。假设在当前线程监听文件状态会导致一下接收为0
new Thread(){
@Override
public void run(){
long startTime = System.currentTimeMillis();
while(!inTransfer.isDone()){
if (inTransfer.getStatus().equals(Status.error)){
System.out.println(sdf.format(new Date())+"error!!!"+inTransfer.getError());
}else{
double progress = inTransfer.getProgress();
progress*=100;
System.out.println(sdf.format(new Date())+"status="+inTransfer.getStatus());
System.out.println(sdf.format(new Date())+"progress="+nf.format(progress)+"%");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("used "+((System.currentTimeMillis()-startTime)/1000)+" seconds ");
}
}.start();
} catch (XMPPException e) {
JOptionPane.showMessageDialog(null, "文件失败", "错误", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
});
System.out.println(connection.getUser()+"--"+connection.getServiceName()+"開始监听文件传输");
}




版权声明:本文博主原创文章。博客,未经同意不得转载。