基于smack的即时聊天系统之文件传输功能实现

功能实现流程为:

1.文件发送方用户登录

2.确定文件的接收方和待发送文件路径

3.获取连接

4.根据连接获取文件接收方的完整jid(例如user@192.168.1.34/MiniQQ 2.3.6),其中MiniQQ 2.3.6为文件接收方用户客户端的resource,必须获取到,否则文件无法发送

5.发送文件

实现代码为:

<span style="font-size:18px;">public int TransFile(String toUser, String fileDir) {
		// final int flag[] = new int[] { 0 };
		Connection conn = this.connection;

		ServiceDiscoveryManager serviceDiscoveryManager = new ServiceDiscoveryManager(
				conn);

		// System.out.println(conn.toString());
		// System.out.println(this.sessionManager.getConnection().toString());

		if (!toUser.contains("@")) {
			toUser = toUser + "@" + this.connection.getServiceName();
		}
		// toUser = toUser +"/Spark 2.6.3";
		Roster roster = connection.getRoster();
		Presence pre = roster.getPresence(toUser);
		toUser = pre.getFrom();
		if (!toUser.contains("/")) {
			//toUser = toUser + "/MiniQQ 2.3.6";
			toUser = toUser + "/MiniQQ 2.3.6";
		}
		System.out.println("向发送文件:" + toUser);
		// System.out.println(toUser);
		if (pre == null) {
			System.out.println("用户不存在");
			return -1;
		}

		FileTransferManager transferManager = new FileTransferManager(conn);

		final File file = new File(fileDir);
		final OutgoingFileTransfer transfer = transferManager
				.createOutgoingFileTransfer(toUser);

		// FutureTask<Integer> task = new FutureTask<Integer>();

		FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
			@Override
			public Integer call() throws Exception {
				int flag = 0;
				try {
					transfer.sendFile(file, "Sending");
					while (!transfer.isDone()) {
						try {
							Thread.sleep(10L);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}

						if (transfer.getStatus() == FileTransfer.Status.in_progress) {
							System.out.println(transfer.getProgress());
							// flag[0] = 0;

						} else {
							if (transfer.getStatus() == FileTransfer.Status.error) {
								System.out.println("file transport failed");//
								// flag[0] = -1;
								flag = -1;
								// return ;
							}
							if (transfer.getStatus() == FileTransfer.Status.refused) {
								System.out
										.println("file transport was refused");
								// flag[0] = -1;
								flag = -1;
								// return ;
							}
						}
					}
				} catch (XMPPException e1) {
					e1.printStackTrace();
					// return ;
				}

				return flag;
			}
		});

		SwingUtilities.invokeLater(task);

		int flagRes = 0;
		while (true) {
			if (task.isDone()) {
				try {
					flagRes = task.get();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
				break;
			}
		}
		return flagRes;
	}</span>
时间: 2024-10-30 04:59:42

基于smack的即时聊天系统之文件传输功能实现的相关文章

基于smack的即时聊天系统之文件接收功能实现

实现思路为: 1.接收方用户登录 2.获取文件发送方用户名 3.获取需要接收的文件名 4.获取需要接收的文件大小 5.设置文件存放路径 6.接收文件 实现代码为: public int SetTransFileCallBack(final Method method, final Object instance, final String downloadeDir) { FileTransferManager transferManager = new FileTransferManager(

基于smack的即时聊天系统之登陆功能的实现

登陆功能的实现:主要思路是:1.配置连接信息2.创建XMPP连接对象:3.建立连接:4.登陆 1.配置连接信息 主要是配置服务器IP和端口号,ConnectionConfiguration()函数中第一个参数是服务器IP地址,第二个参数是端口号.第一个参数也可以写成服务器主机名,要是写为服务器主机名的话,需要修改客户端host,在hosts中添加服务器IP地址和其主机名,如下图所示.host文件在windows系统中的路径为:C:\WINDOWS\system32\drivers\etc\hos

iOS版WPS WiFi文件传输功能快速导入文件

  手机.平板等移动设备成为人们生活中的必需品后,如何简便地将电脑与移动设备连通.实现文件共享成为迫切的问题.文件传输功能软件已经数不胜数,但是在苹果设备上快速完成这个操作,就要说一说iOS版WPS Office新推出的WiFi文件传输功能. iTunes传送文件,需要使用数据线将电脑与移动设备相连.使用网盘又需要登录才可以.通过WiFi文件传输,只需连接WiFi,将移动设备显示的网址在电脑上打开即可将电脑本地文件传输至移动设备上WPS Office的文件夹中.下面就来向大家详细介绍一下这个功能

iOS版WPS Office的WiFi文件传输功能使用教程

手机.平板等移动设备成为人们生活中的必需品后,如何简便地将电脑与移动设备连通.实现文件共享成为迫切的问题.文件传输功能软件已经数不胜数,但是在苹果设备上快速完成这个操作,就要说一说iOS版WPS Office新推出的WiFi文件传输功能. iTunes传送文件,需要使用数据线将电脑与移动设备相连.使用网盘又需要登录才可以.通过WiFi文件传输,只需连接WiFi,将移动设备显示的网址在电脑上打开即可将电脑本地文件传输至移动设备上WPS Office的文件夹中.下面就来向大家详细介绍一下这个功能.

即时通讯-音频文件传输 dialog engine

问题描述 音频文件传输 dialog engine 想做一个实时语音通讯系统,听人介绍了一个dialog engine的东西,网上却没查到相关 信息,希望大牛指点. 或者有相关经验者分享一下实时语音通讯技术.

基于UDT connect连接通信以及文件传输--客户端

上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要操作就是首先给服务端发送文件名,然后将文件直接通过fopen(),fread()等一系列的操作将文件发送过去.         与客户端相对应的源码在另一篇博文中:http://blog.csdn.net/pingd/article/details/16341467         CLIENT端

基于UDT connect连接通信以及文件传输--服务端

网上与UDT相关的资料不多,与UDT相关的源码例子更少.最近在接触UDT,也是因为缺少相关的资料,导致学习起来甚感痛苦.下面将我自己这两天弄出来的代码贴出来,希望对在寻找相关资料的童鞋有一定的帮助.与服务端相对应的客户端在另一篇博文中 [cpp] view plain copy              SERVER端 [cpp] view plain copy   #include <iostream>   #include "udt.h"   #include <

vs+gsoap能否实现文件传输功能,急!

问题描述 求详细解答,有实例参考更好,谢谢! 解决方案 解决方案二:studythesample

嵌入式arm linux蓝牙文件传输移植

嵌入式arm linux蓝牙文件传输移植目前,蓝牙技术已经比较成熟,特别是基于手机和PC得蓝牙文件传输. 本文主要讲述基于嵌入式arm linux的蓝牙文件传输.    现行2.6.x的linux内核都已经集成了bluez蓝牙驱动,对于2.4版本内核的需要到bluez官方网站下载并安装bluez蓝牙驱动.http://www.bluez.org/download/    本为基于2.6版本的内核讲述.对于2.4下载bluez后安装即可.有了bluez蓝牙驱动还需要安装bluez-libs库和bl