重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
现在的即时通讯软件琳琅满目 大家耳熟能详的无非就是腾讯公司的QQ 微软公司的MSN Messenger以及网易的泡泡 就用户量而言这三者应该是名列前茅的 但是腾讯公司的QQ以及网易的泡泡由于并没有公开其客户端与服务器之间的通讯协议导致开发者很难利用起这一庞大的用户群体来开辟另外的服务渠道 MSN Messenger这一由世界头号软件商 微软公司开发的即时通讯软件 凭借其与windows操作系统和整个微软产品家族的紧密结合 简单实用 性能稳定 世界通用等特点 很快被中国用户接受 目前其用户正在以几何数字增长 但是让开发者雀跃的是该软件同时也提供了开放的API以及开放的通讯协议 著名的MSN Plus就是一款利用其API开发的用于扩展MSN Messenger功能的插件 而我们今天要介绍的jMSN则是封装了MSN Messenger开放的通讯协议的Java API 通过这个API开发者完全可以使用Java语言模拟出MSN Messenger软件 API的作者也提供一个用Java语言编写的在某方面功能甚至比MSN Messenger还强大的MSN 客户端软件 由于采用了跨平台的Java语言开发 因此该软件也可同时运行于其他操作系统 目前已经经过测试的有各种Linux系统以及Mac OS上 当然还有视窗操作系统 jMSN是一个韩国人开发的开放源码的API 可以从站点上下载 该项目的首页基本上以韩文为主 包括它的API文档的说明都是韩文 这个让我非常头疼 不过没有关系 因为jMSN非常简单 如果没有什么特殊情况下不看那些说明也没有关系 jmsn是一个完整的Java应用程序 下载解压后可以直接运行 运行的界面跟微软的MSN Messenger很类似 包括操作上都非常一致 如果你的操作系统是Linux或者其他那都可以直接用它来替代微软的程序 另外一个是msnm lib 这个就是我们今天要介绍的API 它仅仅是一个开发包 在jmsn组件中已经包含了这个包 你可能想先体验一下jmsn自带的程序看看到底能完成什么样的功能吧?解压jmsn压缩包后的目录中会有一个可执行文件 不过如果你的JDK不是使用安装程序安装的 建议你不用执行它 它会找不到jre的 你可以使用命令行来启动这个程序 这样做有个好处是你还可以看到运行中打印出来的信息 应该说界面跟MSN Messenger是非常类似的 用户可以通过它发送和接收消息等 在启动jMSN的命令行窗口中可以看到jMSN与服务器之间通讯的详细信息 前面我们主要在介绍jMSN大概的情况 介绍它能完成什么样的功能 下面我们开始来了解怎么利用jMSN自带的API msnm lib来实现这些功能 我们可以通过msnm lib来完成与MSN服务器之间的通讯而不需要我们去操心具体的通讯协议的细节 事实上msnm lib给我们做了更多的事情使得我们使用msnm lib来开发一个MSN应用程序变得非常的简单 这也就是我前面提到的我们完全可以不去可能它所提供的韩文API文档的缘故 因为使用它实在是太简单了 闲话说了那么多 现在我们就开始来开发我们自己基于Java的跨平台的MSN客户端程序 相信听到这句大家都会觉得血脉膨胀 没错 还有什么比动手写程序更让人兴奋的事情呢?何况还是基于Java的 跨平台的!我们先给出一段可运行的代码来完成一个最简单的功能 当有人把它加入好友时 程序自动将之加入好友 当有人给它发送信息 程序自动回复一条相同的信息 完成这么简单的功能的代码如下 /** Created on by Liudong*/package jmsn demo;import rath msnm MSNMessenger;import rath msnm SwitchboardSession;import rath msnm UserStatus;import rath msnm entity MsnFriend;import rath msnm event MsnAdapter;import rath msnm msg MimeMessage;/*** MSN演示程序* @author Liudong*/public class MSNDaemon extends Thread{private static MSNMessenger msn;public static void main(String[] args){msn = new MSNMessenger( you password );msn setInitialStatus(UserStatus ONLINE);msn addMsnListener(new MSNAdapter(msn));msn login();System out println( Waiting for the response );//捕捉Ctrl+C的输入以便注销MSN的登录Runtime getRuntime() addShutdownHook(new MSNDaemon());}/*** 用户中止程序执行*/public void run(){msn logout();System out println( MSN Logout OK );}}/*** MSN消息事件处理类* @author Liudong*/class MSNAdapter extends MsnAdapter{MSNMessenger messenger;public MSNAdapter(MSNMessenger messenger){ssenger = messenger;}/*** 某人正在输入信息*/public void progressTyping(SwitchboardSession ss MsnFriend friend String typingUser){System out println(friend getLoginName() + 正在输入信息 );}/*** 收到消息的时候执行该方法*/public void instantMessageReceived(SwitchboardSession ss MsnFriend friend MimeMessage mime){System out print( 接收到消息 + friend getFriendlyName() + );System out println(mime getMessage());try {//发送相同的回复信息给发送者messenger sendMessage(friend getLoginName() mime);} catch (Exception e){e printStackTrace();}}/*** 登录成功后执行该方法*/public void loginComplete(MsnFriend own){System out println(own getLoginName() + Login OK );}/*** 登录失败后执行该方法*/public void loginError(String header){System out println( Login Failed: + header);}/*** 好友离线时执行该方法*/public void userOffline(String loginName){System out println( USER + loginName + Logout );}/*** 好友上线时执行该方法*/public void userOnline(MsnFriend friend){System out println( USER +friend getFriendlyName()+ Login );}/*** 有人加我为好友时执行*/public void whoAddedMe(MsnFriend friend){System out println( USER + friend getLoginName() + Addme );try {messenger addFriend(friend getLoginName());} catch (Exception e){e printStackTrace();}}/*** 有人把我从好友列表中删除时执行*/public void whoRemovedMe(MsnFriend friend){System out println( USER +friend getLoginName()+ Remove me );try {messenger removeFriend(friend getLoginName());} catch (Exception e){e printStackTrace();}}}除了两个常用的对象MsnFriend以及MimeMessage分别用来表示我的好友以及MSN信息外 其他我们需要了解的也就是MSNMessenger以及MsnAdapter了 当然了前提是我们不需要除了聊天外的其他功能 例如文件传输等等 类MSNMessenger对应着一个帐号的一次登录会话 我们仅仅是需要告诉MSNMessenger类我们登录所用的帐号 密码 登录后的初始状态以及我们怎么来处理从MSN服务器上接收到的任何信息 在msnm lib中 处理MSN信息是通过一个叫MsnAdapter类来处理的 这个类定义了如何处理例如收到消息 有人加我为好友等等的事件 开发者可以重载这些方法以便进行自行处理 我们自行扩展MsnAdapter的类必须告诉MSNMessenger实例知道 这也就是我们前面代码中的msn addMsnListener(new MSNAdapter(msn));自行扩展MsnAdapter的类是用来处理被动消息的 例如有人给我发消息等 当我们要发送消息给别人的时候就需要用到MSNMessenger的实例 这也就是我们为什么要把MSNMessenger的实例传递给MSNAdapter的原因 因为当我们接收到任何消息时要给发送人回复一条相同的信息 到此我们前面提出的简单功能已经完成了 读者可以在自己的机器上进行测试 运行时需要用到msnm lib库 也就是msnm jar文件 关于多人聊天 MSN有另外一个不错的功能就是多人同时聊天 msnm lib对这个功能支持也非常好 在MsnAdapter中定义的方法instantMessageReceived的第一个参数类型为SwitchboardSession 当接收到消息时 我们可以从这个参数中获取多人聊天的一个会话标识 同时可以通过getMsnFriends来读取参与当前聊天的所有好友 当你要主动发送消息的时候你就必须从SwitchboardSession中读取所有的好友并给他们一一发送信息 关于文件传输 可能这是我发现的 lishixinzhi/Article/program/Java/JSP/201311/19199
成都创新互联公司为企业级客户提高一站式互联网+设计服务,主要包括网站设计制作、网站制作、成都app软件开发公司、小程序设计、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。
可以参考QuickDove,支持二次开发与OEM,不过是用C++写的,不是Java。
一、Java软件加密基本思路
对于应用软件的保护笔者从两个方面进行考虑,第一是阻止盗版使用软件,第二是阻止竞争对手对软件反编译,即阻止对软件的逆向工程。
1、阻止盗版
在软件运行时对自身存在的合法性进行判断,如果认为自身的存在和运行是被授权的、合法的,就运行;否则终止运行。这样即使软件可以被随意复制,只要盗版用户没有相应的授权信息就无法使用软件。
2、阻止反编译
对编译产生的Class文件加密处理,并在运行时进行解密,解密者无法对软件进行反编译。
二、Java软件加密的总体流程
为了保护用Java语言开发的软件,我们设计并实现了一个实用、高强度的加密算法。以下称需要保护的Java软件为“受保护程序”,称对“受保护程序”进行加密保护的软件为“加密程序”。对软件加密保护的流程如图1所示。
三、加密算法分析设计
1、用户信息提取器设计
为了防止用户发布序列号而导致“一次发行,到处都是”的盗版问题,提取用户机器中硬件相关的、具有唯一性的信息——用户计算机的硬盘分区C的序列号,并要求用户将此信息与用户名一起返回,之后用“序列号生成器”根据用户返回信息生成一个唯一合法的软件注册序列号发回用户,用户即可使用此号码注册使用软件。
这个信息提取器使用Winclows 32汇编以一个独立的小程序方式实现,程序代码如图2所示。
2、序列号生成器与序列号合法性判断函数的设计
序列号生成器与序列号合法性判断函数中运用RSA加密算法。在序列号生成器中是使用私钥将用户返回的信息(硬盘序列号,用户名)进行加密得到相应的注册序列号;在序列号合法性判断函数中使用私钥将用户输入的注册序列号解密,再与(硬盘序列号,用户名)进行比较,一致则调用程序装载器将程序其他部分解密装入内存,初始化删环境并运行程序主体;否则退出。
RSA加密算法的实现需要使用大数运算库,我们使用MIRACL大数库来实现RSA计算,序列号生成器的主要代码如下:
char szlnputString[]=”机器码和用户名组成的字符串”;
char szSerial[256]=[0];//用于存放生成的注册码
bign,d,c,m; //MIRACL中的大数类型
mip→IBASE=16; //以16进制模式
n= mlrvar(0); //初始化大数
d= mirvar(0);
c= mirvar(0); //C存放输入的字符串大数
m= mlrva(o);
bytes to big( len, szlnputString,c);
//将输入字符串转换成大数形式并存入变量c中
cinstr(n,”以字符串形成表示的模数”);//初始化模数
cinstr(d,”以字符串形成表示的公钥”)://初始化公钥
powmod(c,d,n,m); //计算m=cdmod n
cotstr(m,szSerial);//m的16进制字符串即为注册码
序列号合法性检测函数的主要代码如下:
char szlnputStringL]=”机器码和用户名组成的字符串”;
char szSerial[ 256]=”用户输入的序列号”
bign,e,c,m; //MIRACL中的大数类型
mip→IBASE=16; //以16进制模式
cinstr(m,szSerial); //将序列号的16进制转成大数形式
cinstr(n,”模数n的字符串形式”);//初始化模数n
cinstr(e,”字符串形式的公钥”);//初始化公钥
if compare(m,n)==-1) //mn时才进行解密
{
powmod(m,e,n,c);//计算m=me mod n
big_to _bytes(0,c,szSerial,0); //转为字符串
return lstrcmp( szlnputString,szSerial);
}
3、强耦合关系的设计
如果在序列号合法性检测函数中简单地使用图3所示流程:
解密者可以使用以下几种手段进行攻击:
(1)修改“判断合法性子函数”的返回指令,让它永远返回正确值,这样可以使用任意的序列号,安装/使用软件。
(2)修改判断后的跳转指令,使程序永远跳到正确的分支运行,效果和上一种一样。
(3)在“判断合法性子函数”之前执行一条跳转指令,绕过判断,直接跳转到“正常执行”分支运行,这样可以不用输入序列号安装/使用软件。
为阻止以上攻击手段,笔者在程序中增加了“序列号合法性检测函数”与程序其他部分“强耦合”(即增强其与程序其他部分的关联度,成为程序整体密不可分的一部分,一旦被修改程序将无法正常工作)的要求(见图1),并且设置一个“完整性检测函数”用于判断相关的代码是否被修改过。当然,基于同样的原因,“完整性检测函数”也必须与程序其他部分存在“强耦合”关系。
强耦合关系通过以下方式建立:
在程序其他部分的函数(例如函数A)中随机的访问需要强耦合的“序列号合法性检测函数”和“完整性检测函数”,在调用时随机的选择使用一个错误的序列号或是用户输入的序列号,并根据返回结果选择执行A中正常的功能代码还是错误退出的功能代码,流程如图4所示。
经过这种改进,如果破解者通过修改代码的方式破解将因“完整性检测”失败导致程序退出;如果使用SMC等技术绕过“序列号合法性判断函数”而直接跳至序列号正确时的执行入口,在后续的运行中,将因为随机的耦合调用失败导致程序退出。破解者要破解软件将不得不跟踪所有进行了耦合调用的函数,这显然是一个艰巨的任务。
4、完整性检测函数的设计
我们使用CRC算法算出需进行完整性检测的文件的校验码,并用RSA加密算法的公钥(不同于序列号合法性检测中的公钥/私钥对)将其加密存放在特定的文件中,在检测时先用CRC算法重新生成需进行完
整性检测的文件的校验码,并用私钥将保存的校验码解密,两者相比较,相等则正常运行;否则退出。
5、程序加载器的设计
与编译成机器码执行的程序不同,Java程序只能由Java虚拟机解释执行,因此程序加载器的工作包括:初始化Java虚拟机;在内存中解密当前要运行的class文件;使解密后的c:lass文件在虚拟机中运行,在
需要时解密另一个class文件。图5是用于初始化JVM的代码:
以上介绍了我们设计的针对Java软件的加密保护方法,其中综合运用了多种加密技术,抗破解强度高;使用纯软件保护技术,成本低。经笔者在Windows系列平台上进行测试,运行稳定,效果良好。
在研宄开发过程中,我们还总结出加密保护软件的一些经验:
1、对关键代码和数据要静态加密,再动态解密执行;要结合具体的工作平台使用反跟踪/调试技术;
2、要充分利用系统的功能,如在Windows下使用DLL文件或驱动程序形式能得到最大的丰又限,可以充分利用系统具有的各种功能;
3、如果可能应该将关键代码存放在不可禚复制的地方;
4、序列号要与机器码等用户信息相关以阻止盐复布序列号;
5、加密流程的合理性比加密算法本身的强度更重要。
聊天程序又叫即时通讯系统
分类两部分:客户端和服务端
客户端:用户聊天的界面
服务端:接收消息并转发到指定用户
其中服务端和客户端用tcp或者udp连接,使用socket编程完成通信。
按着这个思路可以开发出一套聊天程序
客户端常用界面 bs版本的又layim
服务端 openfire或者自己实现
服务稳定的推送服务,前段时间研究了一下goeasy,后台推送只需要两行代码, js前端推送也只需要3,4行,而且文档齐全,还提供了后台查询信息收发情况,所以我觉得GoEasy推送服务是个不错的选择。
快速入门:
GoEasy web实时推送官网:
1. 引入goeasy.js
2. 客户端订阅,
Var goeasy = new GoEasy({appkey:’your appkey’});
goeasy.subscribe(channel:”your channel”, onMessage:function(message){alert(‘received message’+ message.content)})
3. 三种推送方式
Javascript: goeasy.publish({channel:’your channel’, message:’your publish msg’});
Java SDK: GoEasy goeasy = new GoEasy(“appkey”); goeasy.publish(“your channel”,”your msg”);
RestAPI:
三步轻松实现web推送及接收
网易云信致力于互联网络技术的开发与研究,使开发者通过简单集成客户端SDK和云端开放API,快速实现强大的移动互联网IM和音视频功能。在场景化方面,深入各行各业,狠抓痛点,第一时间包装相应的场景方案,助力企业解决行业难题。同时,网易云信...
2020-03-09 回答者:网易(杭州)网络有... 10
如何编写一个即时通讯软件
答:可以用bmob做后端,有即时通讯的demo 昨天下班前发布了最新的Bmob_IM_V1.1.2版本的SDK和应用Demo,还未正式通知大家,但还是有人察觉到了,那么,这一次版本更新了什么呢? 主要是针对大家都比较关心的问题进行了集中解决。 一、更新功能: 1、...
2016-12-21 回答者: C900612 2个回答 1
如何搭建一个自己的IM即时通讯聊天软件?
问:如何搭建一个自己的IM即时通讯聊天软件?
答:搭建一个自己的IM即时通讯聊天软件的框架如下:1、CIM 中的各个组件均采用 Spring Boot 构建。2、采用 Netty + Google Protocol Buffer 构建底层通信。3、Redis 存放各个客户端的路由信息、账号信息、在线状态等。4、Zookeeper 用于 IM-server ...
2018-09-03 回答者: 容联云 5个回答 1
怎么用Java写一个即时通讯软件?
答:我看到过一个,链接给你,用websocket的 里面有个example就是im的
2013-05-24 回答者: micoud_10 4个回答 1
写一个简单的即时通讯软件需要掌握哪些基础的网络知识
答:掌握TCP/UDP网络协议,还要知道Socket知识,会java或者C#或者C语言的编程,这样就可以通过语言来实现网络的通讯。建议看看Openfire,采用的协议是XMPP。
2017-02-16 回答者: 天123456941 1个回答
请问可以用哪些语言编写即时通讯软件?
问:并请说明那种语言最好
答:当然要用JAVA和C++等多程序开发. 你可以看这家企业即时通讯软件
2007-03-14 回答者: 13813857798 3个回答
我要用java写一个简单的即时通讯软件,该怎么写。...
问:我们打算先用http实现信息收发,有人会做吗。有demo的话求发我感谢。
答:你是说电脑端手机端都要开发吗,电脑端一般用socket, Android端用XMPP5通信
2015-03-10 回答者: 沦落人1992 1个回答
自己写的小型的即时通讯软件如何像QQ一样实现聊天...
答:用socket或者serversocket,也可以使用数据包。必须要有这个,就可以在不同的计算机上实现即时通讯,但是,其功能与专业的聊天软件差别比较大
2010-11-08 回答者: 孙7421 3个回答 5
求大神帮写用JAVA编写一个即时通信的软件 有常 谢谢了
问:会的留言 可商量后再写
答:描述得太不够具体,,,,,是单对单、还是可以单对多;要不要分群;要不要图片;等
2020-06-17 回答者: 知道网友 2个回答 1
开发一个即时通讯软件需要什么样的人员?
问:开发一个即时通讯软件需要什么样的人员?比如说需要几个程序员,多少平面...
答:要看规模,不知道你要做多大的 架构师 起码1个,如果大的话要两个 数据库设计 人员 美工1-2个 程序员依大小而定,小的话3,4个 大的话就每准了 如果作为产品的话,时间将会很长,自己玩,自己用的话,就很快了