基于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>


相关文章
|
7月前
|
安全 数据安全/隐私保护
直播系统源码部署,高效文件管理与传输的FTP协议
在直播系统源码部署后的每天要处理大量媒体文件的情况下,FTP协议可以依靠自身的强大文件传输管理机制、备份与恢复与自动化任务来帮助平台用户更好的操作体验,通过FTP协议,也确保直播系统源码媒体文件传输的可靠性与安全性,让直播系统源码成为了更优质的平台。
直播系统源码部署,高效文件管理与传输的FTP协议
|
Web App开发 安全 网络协议
Qt开发技术:QWebSocket客户端、服务端介绍与开发
Qt开发技术:QWebSocket客户端、服务端介绍与开发
Qt开发技术:QWebSocket客户端、服务端介绍与开发
|
1月前
|
安全 网络协议 网络安全
【Qt 应用开发】轻松掌握Qt FTP 机制:实现高效文件传输
【Qt 应用开发】轻松掌握Qt FTP 机制:实现高效文件传输
101 0
|
9月前
|
iOS开发 MacOS Windows
比微信文件传输助手更好用的传输工具|Telegram
比微信文件传输助手更好用的传输工具|Telegram
|
9月前
|
监控 Shell
MobaXterm的远程监控是如何实现的?
MobaXterm的远程监控是如何实现的?
195 0
|
9月前
|
算法 C#
《c# 实现p2p文件分享与传输系统》 二、 设计
《c# 实现p2p文件分享与传输系统》 二、 设计
77 0
|
10月前
|
新零售 人工智能 大数据
即时通讯丨即时聊天开发案例,即时通讯丨即时聊天系统开发功能逻辑/详细案例/逻辑项目/源码版
什么是零售?   零售在经济活动中是实现商品销售的最后环节,承担的主要功能就是满足消费者的需求,提供消费者需要的商品。产品在生产者手中或批发者手中,只是一种观念上的使用价值,只有进入消费领域才能更具备现实维度的使用价值,而零售就是将商品从流通领域进入消费领域的最后一个环节。
|
Web App开发 Linux API
好工具推荐系列:Feem和Send-anywhere,跨平台局域网传输工具,文件共享工具
好工具推荐系列:Feem和Send-anywhere,跨平台局域网传输工具,文件共享工具
718 0
好工具推荐系列:Feem和Send-anywhere,跨平台局域网传输工具,文件共享工具
|
监控 Ubuntu Linux
开源项目推荐:基于Qt开发的远程桌面监控和文件传输软件Aspia
开源项目推荐:基于Qt开发的远程桌面监控和文件传输软件Aspia
2153 0
开源项目推荐:基于Qt开发的远程桌面监控和文件传输软件Aspia
|
JavaScript 前端开发
语音聊天程序源码——简单的聊天室搭建
安装好swoole后开始搭建前端 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聊天室</title> </head> <style> #set_name{ mar...
2190 0

热门文章

最新文章