Smack+Openfire 文件接收与发送

转载请说明出处:http://blog.csdn.net/steelychen/article/details/37958839

发送文件需要提供准确的接收放用户名称(例:[email protected])、本地文件全路径(例:E:\\xxx\\xxx.zip)

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

客户端发送文件代码片断

public void sendFire(XMPPConnection conn,String toUser,String filePath)throws XMPPException{
	//conn必须是已经登录了的
	//注册toUser只在一个地方登录过,多处登录有可能会出现接收主收不到请求的问题
	FileTransferManager ftm = new FileTransferManager(conn);
	/*
	 * 检查传递的用户是否正确
	 * toUser="[email protected]"
	 * 192.168.1.100 为openfire服务器地址
	*/
	Presence p = connection.getRoster().getPresence(toUser);
	if(p==null){
		System.out.println("用户不存在");
		return;
	}
	toUser = p.getFrom();//提取完整的用户名称
	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  ");
}

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

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 文件接收与发送

时间: 2024-10-14 17:56:30

Smack+Openfire 文件接收与发送的相关文章

C#Socket文件传输(发送与接收代码)

这里是发送的代码: SendVarData是转码后发送函数 1 /// <summary> 2 /// 发送文件 3 /// </summary> 4 /// <param name="userName"></param> 5 private void SendFileToClient(string userName) 6 { 7 User targetUser = userListDict[userName]; 8 String tar

XMPP——Smack[5]文件传输及离线消息的获取

三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线文件,检测到对方不存在,先发给系统用户,存到服务器路径,并在数据库中保存信息,当对方上线时,系统用户查表,拿文件发送 想是这么想的,问题是时间太紧,没有实现,囧. 下一篇写离线消息和离线文件 文件的发送 开一个文件选择框,选中文件后再调用下面的方法 [java] view plaincopyprin

Android基于XMPP Smack Openfire下学习开发IM(六)总结

不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java [java] view plaincopyprint? package com.techrare.utils; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; imp

Android接收和发送短信

每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能. 一.接收短信 1.创建内部广播接收器类,接收系统发出的短信广播 2.从获得的内容中解析出短信发送者和短信内容 3.在Activity中注册广播 4.添加接收短信权限 下面放上具体的代码 activity_main.xml文件用于显示短信发送者号码和显示短信内容 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

如何解决群聊(MUC)聊天室重复存储、接收自己发送的消息的问题

CHENYILONG Blog 如何#解决方案#群聊(MUC)聊天室重复存储.接收自己发送的消息 编号 项目 描述 1 问题描述 单聊没问题,群聊会出现自动回复的问题 数据库中存储的数据出现的问题 界面上出现的问题:类似自动回复.回音壁一样一模一样地回答.  2 问题产生的原因 3 群聊基本的原理示意图 聊天内容的显示是经由从数据库进行的读取排序, 4 #解决方案# 拦截阻挡红色区域的执行  5 失败的尝试:尝试但是没有效果的方法 // AppDelegate.m中#pragma 接收消息代理监

android: 接收和发送短信

8.2    接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 Android 手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作,如 图 8.4 所示. 图   8.4 不过作为一名开发者,仅仅满足于此显然是不够的.你要知道,Android 还提供了一系 列的 API,使得我们甚至可以在自己的应用程序里接收和发送短信.也就是说,只要你有足 够的信

如何在App中实现IM功能之五快速实现图片接收和发送——箭扣科技Arrownock

如何在App中实现IM功能 之五 快速实现图片接收和发送 社交App中,用户聊天发送或接收图片,是一个非常常见的场景,这里给大家介绍如何利用Arrownock的anSocial的Photo API与anIM结合,来实现发送和接收图片. 发送端详情 当发送方选择好图片点击发送时,为了不影响用户聊天过程中的体验,我们一般会将消息先插入到sqlite数据库中,刷新界面,给这条消息加上Loading动画,表示发送中.而这背后的操作为了能够节省流量的消耗,开发时因为图片往往比较大,所以并不是直接将图片的二

串口通信基础,接收,发送数据

通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种.它们的区别是: 串行通信的分类 1.按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输:    半双工:允许数据在两个方向上传输.但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信:它不需要独立的接收端和发送端,两者可以合并一起使用一个端口.    全双工:允许数据同时在两个方向上传输.因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端.

安卓学习之接收、发送短信

短信接收 android中当手机接收到一条短信后,会发送android.provider.Telephony.SMS_RECEIVED 的广播,这条广播中携带有与短信相关的所有数据.每个应用程序都可以在广播接收器里对他监听. 简单的短信接收程序: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main