仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1677|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA网页编程之JAVA完成MSN Messenger功效

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:40:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,如今的立即通信软件满目琳琅,人人耳熟能详的不过就是腾讯公司的QQ,微软公司的MSNMessenger和网易的泡泡,就用户量而言这三者应当是压倒一切的。可是腾讯公司的QQ和网易的泡泡因为并没有公然其客户端与服务器之间的通信协定招致开辟者很难使用起这一复杂的用户群体来启示别的的服务渠道。MSNMessenger这一由天下头号软件商-微软公司开辟的立即通信软件,依附其与windows操纵体系和全部微软产物家属的严密分离,复杂有用、功能不乱、天下通用等特性,很快被中国用户承受,今朝其用户正在以多少数字增加。可是闪开发者雀跃的是该软件同时也供应了开放的API和开放的通信协定。出名的MSNPlus就是一款使用其API开辟的用于扩大MSNMessenger功效的插件。而我们明天要先容的jMSN则是封装了MSNMessenger开放的通信协定的JAVAAPI,经由过程这个API开辟者完整可使用JAVA言语摹拟出MSNMessenger软件,API的作者也供应一个用JAVA言语编写的在某方面功效乃至比MSNMessenger还壮大的MSN客户端软件。因为接纳了跨平台的JAVA言语开辟,因而该软件也可同时运转于其他操纵体系,今朝已经由测试的有各类Linux体系和MacOS上,固然另有视窗操纵体系。

jMSN是一个韩国人开辟的开放源码的API,能够从http://sourceforge.net/projects/jmsn/站点高低载,该项目标首页基础上以韩文为主,包含它的API文档的申明都是韩文。这个让我十分头疼,不外没有干系,由于jMSN十分复杂,假如没有甚么特别情形下不看那些申明也没有干系。jMSN的主页中供应两个部件供下载以下图所示,个中jmsn是一个完全的JAVA使用程序,下载解压后能够间接运转,运转的界面跟微软的MSNMessenger很相似,包含操纵上都十分分歧,假如你的操纵体系是Linux大概其他那都能够间接用它来替换微软的程序。别的一个是msnm-lib,这个就是我们明天要先容的API,它仅仅是一个开辟包,在jmsn组件中已包括了这个包。





你大概想先体验一下jmsn自带的程序看看究竟能完成甚么样的功效吧?解压jmsn紧缩包后的目次中会有一个可实行文件,不外假如你的JDK不是利用安装程序安装的,倡议你不必实行它,它会找不到jre的。你可使用命令行来启动这个程序,如许做有个优点是你还能够看到运转中打印出来的信息。

启动jMSN的命令:

java-jarjmsn.jar



jMSN的登录界面和主窗口以下图所示:









应当说这个界面跟MSNMessenger长短常相似的。用户能够经由过程它发送和吸收动静等。在启动jMSN的命令行窗口中能够看到jMSN与服务器之间通信的具体信息。

后面我们次要在先容jMSN也许的情形,先容它能完成甚么样的功效。上面我们入手下手来懂得怎样使用jMSN自带的API:msnm-lib来完成这些功效。下图是msnm-lib与jMSN包含MSN体系之间的干系,也就是说我们能够经由过程msnm-lib来完成与MSN服务器之间的通信而不必要我们往费心详细的通信协定的细节。现实上msnm-lib给我们做了更多的事变使得我们利用msnm-lib来开辟一个MSN使用程序变得十分的复杂,这也就是我后面提到的我们完整能够不往大概它所供应的韩文API文档的原因,由于利用它其实是太复杂了。





闽南语说:说破不值钱!闲话说了那末多,如今我们就入手下手来开辟我们本人基于JAVA的跨平台的MSN客户端程序。信任听到这句人人城市以为血脉收缩,没错,另有甚么比下手写程序更让人镇静的事变呢?况且仍是基于JAVA的、跨平台的!

我们先给出一段可运转的代码来完成一个最复杂的功效:当有人把它到场密友时,程序主动将之到场密友,当有人给它发送信息,程序主动复兴一条不异的信息。OK,完成这么复杂的功效的代码以下:


/*
*Createdon2003-11-21byLiudong
*/
packagejmsn.demo;

importrath.msnm.MSNMessenger;
importrath.msnm.SwitchboardSession;
importrath.msnm.UserStatus;
importrath.msnm.entity.MsnFriend;
importrath.msnm.event.MsnAdapter;
importrath.msnm.msg.MimeMessage;
/**
*MSN演示程序
*@authorLiudong
*/
publicclassMSNDaemonextendsThread{
privatestaticMSNMessengermsn;

publicstaticvoidmain(String[]args){
msn=newMSNMessenger("youraccount@hotmail.com","password");
msn.setInitialStatus(UserStatus.ONLINE);
msn.addMsnListener(newMSNAdapter(msn));
msn.login();
System.out.println("Waitingfortheresponse....");
//捕获Ctrl+C的输出以便刊出MSN的登录
Runtime.getRuntime().addShutdownHook(newMSNDaemon());
}
/**
*用户中断程序实行
*/
publicvoidrun(){
msn.logout();
System.out.println("MSNLogoutOK");
}
}
/**
*MSN动静事务处置类
*@authorLiudong
*/
classMSNAdapterextendsMsnAdapter{

MSNMessengermessenger;

publicMSNAdapter(MSNMessengermessenger){
this.messenger=messenger;
}
/**
*或人正在输出信息
*/
publicvoidprogressTyping(
SwitchboardSessionss,
MsnFriendfriend,
StringtypingUser){
System.out.println(friend.getLoginName()+"正在输出信息...");
}
/**
*收到动静的时分实行该办法
*/
publicvoidinstantMessageReceived(
SwitchboardSessionss,
MsnFriendfriend,
MimeMessagemime){
System.out.print("吸收到动静:"+friend.getFriendlyName()+"->");
System.out.println(mime.getMessage());
try{
//发送不异的复兴信息给发送者
messenger.sendMessage(friend.getLoginName(),mime);
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*登录乐成后实行该办法
*/
publicvoidloginComplete(MsnFriendown){
System.out.println(own.getLoginName()+"LoginOK");
}
/**
*登录失利后实行该办法
*/
publicvoidloginError(Stringheader){
System.out.println("LoginFailed:"+header);
}
/**
*密友离线时实行该办法
*/
publicvoiduserOffline(StringloginName){
System.out.println("USER"+loginName+"Logout.");
}
/**
*密友上线时实行该办法
*/
publicvoiduserOnline(MsnFriendfriend){
System.out.println("USER"+friend.getFriendlyName()+"Login.");
}
/**
*有人加我为密友时实行
*/
publicvoidwhoAddedMe(MsnFriendfriend){
System.out.println("USER"+friend.getLoginName()+"Addme.");
try{
messenger.addFriend(friend.getLoginName());
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*有人把我从密友列表中删除时实行
*/
publicvoidwhoRemovedMe(MsnFriendfriend){
System.out.println("USER"+friend.getLoginName()+"Removeme.");
try{
messenger.removeFriend(friend.getLoginName());
}catch(Exceptione){
e.printStackTrace();
}
}

}



除两个经常使用的对象MsnFriend和MimeMessage分离用来暗示我的密友和MSN信息外,其他我们必要懂得的也就是MSNMessenger和MsnAdapter了。固然了条件是我们不必要除谈天外的其他功效,比方文件传输等等。类MSNMessenger对应着一个帐号的一次登录会话。我们仅仅是必要告知MSNMessenger类我们登录所用的帐号、暗码、登录后的初始形态和我们怎样来处置从MSN服务器上吸收到的任何信息。在msnm-lib中,处置MSN信息是经由过程一个叫MsnAdapter类来处置的,这个类界说了怎样处置比方收到动静、有人加我为密友等等的事务,开辟者能够重载这些办法以便举行自行处置。我们自行扩大MsnAdapter的类必需告知MSNMessenger实例晓得,这也就是我们后面代码中的msn.addMsnListener(newMSNAdapter(msn));自行扩大MsnAdapter的类是用来处置主动动静的,比方有人给我发动静等。当我们要发送动静给他人的时分就必要用到MSNMessenger的实例,这也就是我们为何要把MSNMessenger的实例传送给MSNAdapter的缘故原由,由于当我们吸收就任何动静时要给发送人复兴一条不异的信息。

到此我们后面提出的复杂功效已完成了,读者能够在本人的呆板长进行测试,运转时必要用到msnm-lib库,也就是msnm.jar文件。下图是运转时分的一个截图:






关于多人谈天:

MSN有别的一个不错的功效就是多人同时谈天,msnm-lib对这个功效撑持也十分好。在MsnAdapter中界说的办法instantMessageReceived的第一个参数范例为SwitchboardSession。当吸收到动静时,我们能够从这个参数中猎取多人谈天的一个会话标识,同时能够经由过程getMsnFriends来读取介入以后谈天的一切密友。当你要自动发送动静的时分你就必需从SwitchboardSession中读取一切的密友并给他们逐一发送信息。

关于文件传输:

大概这是我发明的关于msnm-lib的独一不敷,大概说还不敷完美的部分。经由测试发明利用微软的MSN程序能够一般传输文件的两台呆板用jMSN却没法传输,毛病信息都是说毗连超时,这两台呆板不在统一个子网。信任msnm-lib对这个功效并没有举行处置。因为并没有两台间接毗连Internet的呆板,因而关于jMSN的文件传输一向都没有举措来做一个实验,但愿新版本的msnm-lib能办理好这个成绩。

总结:

只管在文件传输上有点瑕疵,可是msnm-lib所供应的功效已十分棒了,最少在我第一眼看到它的时分内心说:没错,这就是我想要的工具!本文旨在先容怎样利用msnm-lib来完成一个复杂的MSN客户端,至于假如让它在实践的使用体系中发扬感化,读者们一定有比我更多的设法,好比说是不是能够使用它来丰厚客服的渠道等等,固然这些都凌驾我们的标题。如在利用中发明任何成绩,接待来信配合研讨。




首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
活着的死人 该用户已被删除
沙发
发表于 2015-1-21 12:39:02 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-24 23:17:23 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
灵魂腐蚀 该用户已被删除
地板
发表于 2015-1-27 06:31:30 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
飘灵儿 该用户已被删除
5#
发表于 2015-2-5 00:23:37 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
分手快乐 该用户已被删除
6#
发表于 2015-2-11 00:04:35 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
谁可相欹 该用户已被删除
7#
 楼主| 发表于 2015-2-17 02:03:20 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
简单生活 该用户已被删除
8#
发表于 2015-3-2 01:01:13 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-11 01:20:42 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
再见西城 该用户已被删除
10#
发表于 2015-3-17 12:09:45 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
深爱那片海 该用户已被删除
11#
发表于 2015-3-18 10:41:34 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
若天明 该用户已被删除
12#
发表于 2015-3-21 08:41:54 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
飘飘悠悠 该用户已被删除
13#
发表于 2015-3-26 20:07:10 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
小妖女 该用户已被删除
14#
发表于 2015-4-11 07:10:06 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
蒙在股里 该用户已被删除
15#
发表于 2015-4-16 04:10:05 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
柔情似水 该用户已被删除
16#
发表于 2015-4-19 09:53:55 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
精灵巫婆 该用户已被删除
17#
发表于 2015-4-26 00:02:35 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
若相依 该用户已被删除
18#
发表于 2015-4-26 10:39:01 | 只看该作者
是一种使用者不需花费很多时间学习的语言
不帅 该用户已被删除
19#
发表于 2015-5-1 07:09:02 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
再现理想 该用户已被删除
20#
发表于 2015-5-1 21:12:11 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-17 07:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表