`

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

 
阅读更多

1.       文件的发送

开一个文件选择框,选中文件后再调用下面的方法

 

  1. public static void sendFile(XMPPConnection connection,  
  2.             String user, File file) throws XMPPException, InterruptedException {  
  3.           
  4.         System.out.println("发送文件开始"+file.getName());  
  5.         FileTransferManager transfer = new FileTransferManager(Client.getConnection());  
  6.         System.out.println("发送文件给: "+user+Client.getServiceNameWithPre());  
  7.         OutgoingFileTransfer out = transfer.createOutgoingFileTransfer(user+Client.getServiceNameWithPre()+"/Smack");//  
  8.           
  9.         out.sendFile(file, file.getName());  
  10.           
  11.         System.out.println("//////////");  
  12.         System.out.println(out.getStatus());  
  13.         System.out.println(out.getProgress());  
  14.         System.out.println(out.isDone());  
  15.           
  16.         System.out.println("//////////");  
  17.           
  18.         System.out.println("发送文件结束");  
  19.     }  

 

 

 

2.       文件接收,必须使用监听

 

 

  1. FileTransferManager transfer = new FileTransferManager(connection);  
  2. transfer.addFileTransferListener(new RecFileTransferListener());  
  3.   
  4. public class RecFileTransferListener implements FileTransferListener {  
  5.   
  6.     public String getFileType(String fileFullName)  
  7.     {  
  8.         if(fileFullName.contains("."))  
  9.         {  
  10.             return "."+fileFullName.split("//.")[1];  
  11.         }else{  
  12.             return fileFullName;  
  13.         }  
  14.           
  15.     }  
  16.       
  17.     @Override  
  18.     public void fileTransferRequest(FileTransferRequest request) {  
  19.         System.out.println("接收文件开始.....");  
  20.         final IncomingFileTransfer inTransfer = request.accept();  
  21.         final String fileName = request.getFileName();  
  22.         long length = request.getFileSize();   
  23.         final String fromUser = request.getRequestor().split("/")[0];  
  24.         System.out.println("文件大小:"+length + "  "+request.getRequestor());  
  25.         System.out.println(""+request.getMimeType());  
  26.         try {   
  27.               
  28.             JFileChooser chooser = new JFileChooser();   
  29.             chooser.setCurrentDirectory(new File("."));   
  30.               
  31.             int result = chooser.showOpenDialog(null);  
  32.               
  33.             if(result==JFileChooser.APPROVE_OPTION)  
  34.             {  
  35.                 final File file = chooser.getSelectedFile();  
  36.                 System.out.println(file.getAbsolutePath());  
  37.                     new Thread(){  
  38.                         public void run()  
  39.                         {  
  40.                         try {  
  41.   
  42.                             System.out.println("接受文件: " + fileName);  
  43.                             inTransfer  
  44.                                     .recieveFile(new File(file  
  45.                                             .getAbsolutePath()  
  46.                                             + getFileType(fileName)));  
  47.   
  48.                             Message message = new Message();  
  49.                             message.setFrom(fromUser);  
  50.                             message.setProperty("REC_SIGN""SUCCESS");  
  51.                             message.setBody("["+fromUser+"]发送文件: "+fileName+"/r/n"+"存储位置: "+file.getAbsolutePath()+ getFileType(fileName));  
  52.                             if (Client.isChatExist(fromUser)) {  
  53.                                 Client.getChatRoom(fromUser).messageReceiveHandler(  
  54.                                         message);  
  55.                             } else {  
  56.                                 ChatFrameThread cft = new ChatFrameThread(  
  57.                                         fromUser, message);  
  58.                                 cft.start();  
  59.                                   
  60.                             }  
  61.                         } catch (Exception e2) {  
  62.                             e2.printStackTrace();  
  63.                         }  
  64.                         }  
  65.                     }.start();  
  66.             }else{  
  67.                   
  68.                 System.out.println("拒绝接受文件: "+fileName);  
  69.                   
  70.                 request.reject();  
  71.                 Message message = new Message();  
  72.                 message.setFrom(fromUser);  
  73.                 message.setBody("拒绝"+fromUser+"发送文件: "+fileName);  
  74.                 message.setProperty("REC_SIGN""REJECT");  
  75.                 if (Client.isChatExist(fromUser)) {  
  76.                     Client.getChatRoom(fromUser)  
  77.                             .messageReceiveHandler(message);  
  78.                 } else {  
  79.                     ChatFrameThread cft = new ChatFrameThread(  
  80.                             fromUser, message);  
  81.                     cft.start();  
  82.                 }  
  83.             }  
  84.               
  85.               
  86.               
  87.               
  88.                
  89.             /* InputStream in = inTransfer.recieveFile(); 
  90.               
  91.              String fileName = "r"+inTransfer.getFileName(); 
  92.               
  93.              OutputStream out = new FileOutputStream(new File("d:/receive/"+fileName)); 
  94.              byte[] b = new byte[512]; 
  95.              while(in.read(b) != -1) 
  96.              { 
  97.                  out.write(b); 
  98.                  out.flush(); 
  99.              } 
  100.               
  101.              in.close(); 
  102.              out.close();*/  
  103.         } catch (Exception e) {  
  104.             e.printStackTrace();  
  105.         }  
  106.           
  107.         System.out.println("接收文件结束.....");  
  108.   
  109.     }  
  110.   
  111. }  

 

 

 1.离线消息

  openfire本身是支持离线消息的,不需要进行额外处理,可以用spark测试下

  使用smack,其实他提供了相应的方法

  Class OfflineMessageManager

 

  可以看下描述

 

The OfflineMessageManager helps manage offline messages even before the user has sent an available presence. When a user asks for his offline messages before sending an available presence then the server will not send a flood with all the offline messages when the user becomes online. The server will not send a flood with all the offline messages to the session that made the offline messages request or to any other session used by the user that becomes online.

 

英文退化了点,汗,大意就是,必须在发送在线信息之前去获取离线消息 

 

刚开始没看这个,结果在上线之后,去取,结果。。。。离线消息数量总是为零,囧

 

首先,连接,状态要设为离线

 

  1. ConnectionConfiguration connConfig = new ConnectionConfiguration(serverDomain);  
  2.     
  3.   connConfig.setSendPresence(false); // where connConfig is object of .  
  4.   
  5.      connection = new XMPPConnection(connConfig);  
  6.      connection.connect();  

 

 

然后,登陆

  connection.login(userName, pwd);

 

接着,拿离线消息

 

  1. OfflineMessageManager offlineManager = new OfflineMessageManager(  
  2.                 Client.getConnection());  
  3.         try {  
  4.             Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager  
  5.                     .getMessages();  
  6.   
  7.             System.out.println(offlineManager.supportsFlexibleRetrieval());  
  8.             System.out.println("离线消息数量: " + offlineManager.getMessageCount());  
  9.   
  10.               
  11.             Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();  
  12.               
  13.             while (it.hasNext()) {  
  14.                 org.jivesoftware.smack.packet.Message message = it.next();  
  15.                 System.out  
  16.                         .println("收到离线消息, Received from 【" + message.getFrom()  
  17.                                 + "】 message: " + message.getBody());  
  18.                 String fromUser = message.getFrom().split("/")[0];  
  19.   
  20.                 if(offlineMsgs.containsKey(fromUser))  
  21.                 {  
  22.                     offlineMsgs.get(fromUser).add(message);  
  23.                 }else{  
  24.                     ArrayList<Message> temp = new ArrayList<Message>();  
  25.                     temp.add(message);  
  26.                     offlineMsgs.put(fromUser, temp);  
  27.                 }  
  28.             }  
  29.   
  30.             //在这里进行处理离线消息集合......  
  31.             Set<String> keys = offlineMsgs.keySet();  
  32.             Iterator<String> offIt = keys.iterator();  
  33.             while(offIt.hasNext())  
  34.             {  
  35.                 String key = offIt.next();  
  36.                 ArrayList<Message> ms = offlineMsgs.get(key);  
  37.                 TelFrame tel = new TelFrame(key);  
  38.                 ChatFrameThread cft = new ChatFrameThread(key, null);  
  39.                 cft.setTel(tel);  
  40.                 cft.start();  
  41.                 for (int i = 0; i < ms.size(); i++) {  
  42.                     tel.messageReceiveHandler(ms.get(i));  
  43.                 }  
  44.             }  
  45.               
  46.               
  47.             offlineManager.deleteMessages();  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  

 

 

记得最后要把离线消息删除,即通知服务器删除离线消息

offlineManager.deleteMessages();

否则,下次上了消息还存在

接着,上线

 Presence presence = new Presence(Presence.Type.available);
        connection.sendPacket(presence);

 

2.离线文件

 

这个我没实现,汗

主要思想:开发openfire插件,拦截离线文件,将文件存到服务器上,同时在数据库里开一张表,存储文件信息

               当用户上线时,查表,若是有,根据路径,拿了发送

当然,大家可以谷歌下是否有相应的插件,时间紧迫,我倒是没找着

 

 

 

到这里,大概就这些了,对了,还扩展了个视频音频聊天,不过使用的是JMF,点对点的,本来打算使用jingle的,结果连API文档都没找到,晕死

 

就这些

 

 

 

分享到:
评论

相关推荐

    基于Java的消息中间件java操作demo.zip

    消息中间件java操作demo 提供activeMq的 java实现,和两种模式:点对点、发布和订阅 直接clone下来,导入maven项目启动test包下的 Client.java

    基于 Python 的波士顿房价数据集

    波士顿房价数据集 波士顿房价数据集 目的:通过分析十三个房屋特征与房价的关系,同时建立模型进行房价预测 波士顿房价指标与房价的关系 CRIM:城镇人均犯罪率——负相关占比 ZN:住宅用地所占比例——无单个特征 INDUS:城镇中非住宅用地所占比例——负相关 CHAS:虚拟变量,用于回归分析——无单个特征 NOX:环保指数——无单个特征 RM:每栋住宅的房间数——正相关 AGE:1940年以前建成的自住单位的比例——无单个特征 DIS:距离5个波士顿的就业中心的加权距离——无单个特征 RAD:距离高速公路的便利指数——无单个特征 TAX:每一万美元的不动产税率——无单个特征 PTRATIO:城镇中教师学生比例——无单个特征 B:城镇中黑人的比例——无单个特征 LSTAT:地区中多少房东属于低收入人群——负相关 MEDV:自主房屋房价中位数(标签数据)——房价中位数

    优秀毕业设计 基于STM32单片机的家庭智能安全系统源码+详细文档+全部数据资料.zip

    【资源说明】 优秀毕业设计 基于STM32单片机的家庭智能安全系统源码+详细文档+全部数据资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于python U2Net 深度学习的证件照生成.zip

    基于python U2Net 深度学习的证件照生成.zip

    python爬虫教程系列、从0到1学习python爬虫,包括浏览器抓包,手机APP抓包

    python爬虫教程系列、从0到1学习python爬虫,包括浏览器抓包,手机APP抓包,如 fiddler、mitmproxy,各种爬虫涉及的模块的使用,如:requests、beautifulSoup、selenium、appium、scrapy等,以及IP代理,验证码识别,Mysql,MongoDB数据库的python使用,多线程多进程爬虫的使用,css 爬虫加密逆向破解,JS爬虫逆向,分布式爬虫,爬虫项目实战实例等

    node-v6.14.3-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.2.1-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    streamlit hello.py

    streamlit hello.py

    +++罗兰贝格PPT模板-436页(绝对经典!)

    +++罗兰贝格PPT模板-436页(绝对经典!)

    固定资产管理系统.zip

    固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进、接触、销毁,对物品的使用状态、借出状态、库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询等。本系统结构如下: (1)系统登录: 用户登录模块:登录功能 重置 (2)系统用户管理: 对系统用户的增加 系统用户的权限修改 系统用户的删除 分配系统用户的权限 修改本身登录密码 资产的相关维护 (3)员工信息管理: 教工的增加、修改、删除、查询 (4)资产入库管理: 资产的录入 资产的属性修改 资产的报废删除 资产的属性查询 (5)资产维护管理: 物资的维修、维护物资的信息修改 (7)资产借还管理: 增加借出资产 查询借出资产 归还已借出资产 (8)打印报表

    GB 4762-1984 政治面貌代码.pdf

    GB 4762-1984 政治面貌代码.pdf

    全域系统链性态网体系化作战矩阵.txt

    全域系统链性态网体系化作战矩阵.txt

    高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    基于深度学习的普通话语音识别.zip

    基于深度学习的普通话语音识别.zip

    Unity开发实践:2D平台跳跃游戏实践心得与案例解析

    案例说明:开发一个简单的2D平台跳跃游戏,游戏中,玩家控制一个角色跳过障碍物,收集金币,以达到终点。 Unity是一个功能全面、灵活性高的游戏开发平台,适合各种规模的项目开发。通过本报告的分享,希望能帮助初学者快速掌握Unity开发的核心内容,并在实际开发中运用这些知识和技能。本报告旨在通过详细的案例分析和代码示例,为Unity开发者提供实用的指导和参考,助力开发者构建更加丰富和专业的游戏作品。

    node-v7.5.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.17.1-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于STC8A8K64S4A12国产单片机参考程序LCD12864 液晶oled LCD1602显示等例程工程源码合集(45个)

    基于STC8A8K64S4A12国产单片机参考程序LCD12864 液晶oled LCD1602显示等例程工程源码合集(45个): 30 DS18B20温度读取 串口监测 31 LCD12864 汉字显示函数 32 LCD12864 哆啦A梦图片显示 33 LCD12864 图片显示 34 红外解码 35 红外解码的应用 36 spi初始化 串口监测 37 外部FLASH读写 串口监测 38 NRF无线通讯测试 串口检测 39 9325TFT刷屏测试 4 定时器0 模式0 40 串口3 定时器2 41 串口3 定时器3 42 串口4 定时器4 43 主机对从机ISP程序下载 参考程序 44 SPI主从机设置通讯 测试程序 45 ESP8266 AP+Station服务器模式测试 5 定时器0 P35模拟10位或16位PWM输出程序 6 定时器1 模式0 7 定时器2 8 看门狗实验 9 串口1发送 8位自动重装载 2 P55口LED灯运行 使能外部晶振 20 16位PCA定时器脉冲输出 21 串口控制8位PWM 占空比 22 8位PWM控制P3.5 23 硬体I2C 主机访问AT24C

    通过python编写sftp上传和下载

    #!/usr/bin/python # -*- coding:utf-8 -*- #参考:https://blog.csdn.net/qq_43057091/article/details/82179301 import os,sys import paramiko #创建transport对象 t = paramiko.Transport(('192.168.56.102',22)) #连接服务器 #创建sftp对象 #将temp.txt上传到服务器/home/redhat/Documents目录 # 将sftp.txt下载到本机桌面

    基于消息中间件的学习记录以及源码示例【JMS、AMQP、ActiveMQ、RocketMQ】.zip

    基于消息中间件的学习记录以及源码示例【JMS、AMQP、ActiveMQ、RocketMQ】.zip

Global site tag (gtag.js) - Google Analytics