Smack+Openfire 接收和发送文件
转载请注明出处:http://blog.csdn.net/steelychen/article/details/37958839
发送文件须要提供准确的接收放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()+"開始监听文件传输");
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
Smack+Openfire 接收和发送文件的更多相关文章
- [转]C#网络编程(订立协议和发送文件) - Part.4
本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx 源码下载:http://www.trac ...
- C#网络编程(订立协议和发送文件) - Part.4
文件传输 前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件.比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1.S2或S3(S为Send缩写)时, ...
- httpurlconnection发送文件到服务端并接收
httpurlconnection发送文件到服务端并接收 客户端 import java.io.DataInputStream; import java.io.File; import java.io ...
- go 接收发送文件
package main import ( "fmt" "os" "net" "io" ) //发送文件内容 func ...
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...
- android: 接收和发送短信
8.2 接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 A ...
- android开发,socket发送文件,read阻塞,得不到文件尾-1
这是我的接收文件代码:开始可以读取到-1,但是现在又读取不到了,所以才加上红色字解决的(注释的代码) File file = new File(mfilePath,"chetou." ...
- socket(TCP)发送文件
一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.Componen ...
- xmpp发送文件
xmpp 文件传输协议: XEP-0096: SI File Transfer:文件传输流初始化协议 XEP-0065: SOCKS5 Bytestreams:带外socks5代理字节流传输协议 XE ...
随机推荐
- [小工具] Command-line CPU Killer(附源码及下载链接)
博主有次在拆卸自己的笔记本电脑后,发现电脑如果静置时间长了有时会重启,但奇怪的是当我自己在电脑前工作的时候从来没有重启过.据此推测可能 CPU 完全空闲的时候风扇完全停转了,虽然 CPU 温度不高,但 ...
- 知问前端--Ajax
本节课主要是创建一个问题表,将提问数据通过 ajax 方式提交出去.然后对内容显示进行布局,实现内容部分隐藏和完整显示的功能. 一.Ajax 提问创建一个数据表:question,分别建立:id.ti ...
- python 元类与定制元类
1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看 ...
- (转)js学习笔记()函数
1.调用函数时,如果参数多于定义时的个数,则多余的参数将会被忽略,如果少于定义时的个数则缺失的参数数会被自动赋予undefined值. 2.如果是用function语句声明的函数定义则不可以出现在循环 ...
- 使用Uploadify 时,同时使用了jQuery.Validition 验证控件时,在IE11上出现JS缺少对象错误。
场景: 使用jQuery.1.8.2 使用 Uploadify 3.2上传控件 使用jQuery.Validition 1.9 验证 使用IE 11 时,当鼠标点击上传按钮时,会出现JS 缺少对象错误 ...
- JDK6和JDK7中的substring()方法
substring(int beginIndex, int endIndex)在JDK6与JDK7中的实现方式不一样,理解他们的差异有助于更好的使用它们.为了简单起见,下面所说的substring() ...
- (原)torch使用caffe时,提示CUDNN_STATUS_EXECUTION_FAILED
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6230227.html 提前说明:此文不能真正解决该问题,具体原因我也不知道... 以前使用某台电脑A上 ...
- Javascript计算密码的强度
用Javascript评估用户输入密码的强度 1.如果密码少于5位,那么就认为这是一个弱密码.2.如果密码只由数字.小写字母.大写字母或其它特殊符号当中的一种组成,则认为这是一个弱密码.3.如果密码由 ...
- PHP学习系列(1)——字符串处理函数(2)
6.chunk_split() 函数把字符串分割为一连串更小的部分.本函数不改变原始字符串. 语法:chunk_split(string,length,end) 参数: string——必需.规定要分 ...
- Python核心编程(第八章)--条件和循环
如果一个复合语句(if子句,while或for循环)的代码仅仅包含一行代码,可以和前面的语句写在同一行上: elif语句(else-if) 条件表达式(三元操作符) X if C else Y 计 ...