背景

应用背景。公司内网使用飞秋通讯,平台的一些消息推送到飞秋群里,更加直观,方便处理

技术分析

飞秋本身并不开源,但兼容飞鸽,所以它采用一样的加密算法:blowfish,而加密key,就是发送方的mac地址
飞秋的群消息,采用组播传输,组播地址226.81.9.8 端口号2425
写个简单的程序,监听2425端口,拦截一条群消息,发现其消息格式如下
解释下各字段的含义
1_lbt6 :版本号,开头,有的也为1_lbt4
0:飞秋默认头像的ID
128:未知
080027090471:发送方mac地址
#0#0# :未知
96:加密的字节长度
4001:未知,好像跟版本有关系,见过为4000的
1466349191:时间戳,距离1970年1月1日0时起的秒数
vitrual:发送方用户名
VB:发送方pc名称
后面的乱码:加密后的字节串+一些填充字符
知道这些信息后就可以解析飞秋的群消息了,未知的几个字段并不影响,构造消息时候copy就行了。以上各字段的意思,是Google和自己分析来的

编码

监听群消息

/*** 监听整个组播地址内的群消息*/public static void listenGroupMsg() {MulticastSocket msr = null;try {InetAddress group = InetAddress.getByName(DEFAULT_BROADCASE_IP);msr = new MulticastSocket(DEFAULT_BROADCASE_PORT);msr.joinGroup(group);byte[] buf = new byte[1024];while (true) {DatagramPacket dp = new DatagramPacket(buf, buf.length);msr.receive(dp);GroupMsg groupMsg = getGroupMsg(dp.getData());if (groupMsg != null) {System.out.println(groupMsg.toString());}}} catch (Exception e) {e.printStackTrace();} finally {if (msr != null) {msr.close();}}}private static GroupMsg getGroupMsg(byte[] data) throws Exception {if (!isGroupMsgType(data)) {return null;}//整个消息类似于这种格式//1_lbt6_0#128#080027090471#0#0#96#4001#9:1466349191:vitrual:VB:4194339:晠8q凗梢舔�}J=R�B騪N�h1'r熜�=猙熇YC翝�2�酒f*膭h鋮String mac = getGroupMac(data);String userName = getUserName(data);String pcName = getPcName(data);byte[] encryData = getEncryData(data, getEncryDataLength(data));if (encryData == null) {return null;}byte[] decryData = decrypt(mac, encryData);//从消息体中获取群号和消息内容//QUNMSGMARK#3b199b07_24901708#/:bomb{/font;-16 0 0 0 400 0 0 0 134 0 0 2 32 微软雅黑 8404992;}String msgBody = new String(decryData, DEFAULT_ENCODING);GroupMsg groupMsg = new GroupMsg();groupMsg.setMac(mac);groupMsg.setUserName(userName);groupMsg.setPcName(pcName);groupMsg.setTime(DateUtil.getFormatTime(new Date()));if (msgBody.indexOf("#") > 0 && msgBody.indexOf("_") > 0) {groupMsg.setGroupNum(Long.valueOf(msgBody.substring(msgBody.indexOf("#") + 1, msgBody.indexOf("_")), 16));msgBody = msgBody.substring(msgBody.indexOf("_"));}if (msgBody.lastIndexOf("{") > 0 && msgBody.indexOf("#") > 0) {groupMsg.setMsg(msgBody.substring(msgBody.indexOf("#") + 1, msgBody.lastIndexOf("{")));}return groupMsg;}

发送群消息

 /*** 向指定群,发送群消息** @param groupNum* @param msg* @param userName* @param pcName* @param mac*/public static void sendGroupMsg(long groupNum, String msg, String userName, String pcName, String mac) {try {InetAddress group = InetAddress.getByName(DEFAULT_BROADCASE_IP);MulticastSocket msr = new MulticastSocket(DEFAULT_BROADCASE_PORT);msr.joinGroup(group);byte[] sendData = getSendData(groupNum, msg, userName, pcName, mac);DatagramPacket dp = new DatagramPacket(sendData, sendData.length, group, DEFAULT_BROADCASE_PORT);msr.send(dp);msr.close();} catch (Exception e) {e.printStackTrace();}}private static byte[] getSendData(long groupNum, String msg, String userName, String pcName, String mac) throws Exception {byte[] groupData = String.format("QUNMSGMARK#%s_%d#%s%s", Long.toHexString(groupNum), (System.currentTimeMillis() / 1000), msg, DEFAULT_FONT).getBytes(DEFAULT_ENCODING);byte[] groupEncryptData = encrypt(mac, groupData);byte[] headData = String.format("1_lbt4_0#128#%s#0#0#%d#4000#9:%d:%s:%s:%d:", mac, groupEncryptData.length, (System.currentTimeMillis() / 1000), pcName, userName, MSG_TYPE_GROUP).getBytes(DEFAULT_ENCODING);byte[] fullData = new byte[headData.length + groupEncryptData.length];System.arraycopy(headData, 0, fullData, 0, headData.length);System.arraycopy(groupEncryptData, 0, fullData, headData.length, groupEncryptData.length);return fullData;}

测试结果

接收消息
发送消息
完整的代码,放到github上了
https://github.com/pigercc/javaFeiqiu

Java监听和发送飞秋群消息相关推荐

  1. java监听短信_Android上监听收到的短信(SMS)

    Android SDK1.1 验证可行. 1.实现一个Receiver[收到的是PDU,需要从PDU中还原出SMSMessage] Java代码 public void onReceive(Conte ...

  2. 使用Java监听网络流量

    使用 JPCAP抓包,可以使用JAVA写代码对数据进行分析,最后可视化显示; 本文只实现了使用 Java语言的jpcap接口 在 IDEA环境下抓取数据包的功能 一.Java搭建 winpcap开发环 ...

  3. Android监听SMS发送状态并获取短信服务中心号码

    监听SMS发送状态的例子网上虽然有,但还是太杂了不完全.自己写了个. 短信服务中心号码的获取是通过SmsMessage.getServiceCenterAddress()方法获得.也就是只能从已经存储 ...

  4. java swing列表数据加监听,【Java Swing公开课|Java监听列表项选择事件怎么用,看完这篇文章你一定就会了】- 环球网校...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  5. android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息

    融云 IMkit 拦挡或监听所有发送音讯 最近集成融云 IMkit 的 SDK, 有一个需要是要监听所有收回去的音讯, 依据音讯类型拦挡或者进行批改. 在官网文档上着了一遍, 都没有找到, 偶尔在看 ...

  6. java 监听控制台输入

    分享一下我写的java监听控制台输入并可以给出响应的功能. 很多时候需要监听控制台的输入内容,相当于信号监听,根据输入的内容做出相应的动作,这里给出我的一个简单实现. 要注意的是:监听得到的消息中前后 ...

  7. Java监听mysql的binlog详解(mysql-binlog-connector)

    Java监听mysql的binlog详解(mysql-binlog-connector) 1. 需求概述 2. 技术选型 3. 方案设计 3.环境准备 3.1 查看是否开启binlog 3.2 mys ...

  8. java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...

    客户端:向指定端口发送信息 package com.jszc.lottery.modules.longpay.util; import java.io.BufferedReader; import j ...

  9. java监听变量的变化_[Java学习小记]使用PropertyChangeSupport来监听变量的变化

    最近开始要着手写一个web项目 ,之前没怎么 写过Java ,所以觉得蛮有必要把每天学习到的一些知识点或者解决的一些问题给记录下来 .一来供自己在整理过程中掌握巩固,二来也为以后再次出现该问题时能快速 ...

  10. java 监听队列_spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

最新文章

  1. 记录一次自己调试代码的过程
  2. labVIEW与单片机实现串口通信的设计过程
  3. 打开AI芯片的“万能钥匙”
  4. nginx发布antd-pro项目(别人发的,未测试)
  5. Java基于springMVC的验证码案例
  6. Codeforces Round #651 (Div. 2) D
  7. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
  8. python求第n个质数_找到第n个质数:麻木
  9. WPF学习笔记(数据绑定篇3)
  10. Spring AOP源码分析(二)JDK动态代理和CGLIB介绍
  11. python3生成文件对象(五分钟读懂)
  12. 图书馆占座系统(三)
  13. easyui-combobox之setText与setValue先后之分
  14. ASCII码表的应用
  15. c51单片机时钟程序汇编语言,51单片机时钟汇编程序
  16. 快手申请快手联盟商选商标,商标注册的申请程序有哪些?
  17. ROS从入门到精通3-5:blender机器人模型定制皮肤贴图
  18. 《网络攻防实践》第四周作业
  19. 海润与联合“罗生门”升级
  20. 关于SPWM 和SVPWM调制比和电压利用率的理解总结——基础补充(一)

热门文章

  1. 如何使用Visual Studio 2017建立一个C语言项目
  2. Java基础知识笔记整理(零基础学Java)
  3. 2019 互联网月饼哪家强?阿里走情怀;百度最土豪;浪潮最高冷;抖音最.........
  4. pass平台java,mPass 微服务开发平台
  5. 深度解析 mPaaS 小程序一站式研发
  6. 凸包算法详解(Graham扫描法)
  7. 软件架构及几种典型框架
  8. C语言 进制转换 将十进制转换为任意进制
  9. 项目管理工具project软件学习(四) - 日历保存为模板、日历重命名、删除
  10. Linux系统之备份与恢复