协作开发:NetCaller(基于java技术的点对点聊天程序)

cherami 2001-11-02 01:51:00
NetCaller设计草案
系统名称:NetCaller(基于java技术的点对点聊天程序)
设计目的:使用java技术提供一个完全跨平台使用的通用网络聊天工具,不受服务器端的限制,充分发挥各客户机的能力。
开发背景:目前没有类似的软件产品能够提供完全的跨平台能力,而且大多是使用服务器/客户端方式开发,使用者受限于服务器的服务能力和状态,一旦服务器瘫痪将造成所有用户的通讯中断。而且在服务商的用户达到一定数量后开始对用户施加限制和增加用户不愿看到的内容以及增加广告,例如oicq。由于java技术已经被大多流行的系统所接受,而使用swing技术开发的java程序可以直接在各个平台上运行,通过使用tcp/ip技术又可以实现通讯的跨平台性,因此本系统理论上是完全可以跨平台使用的。
开发环境:软件要求jdk1.2及以上版本,工具不限,系统不限,根据最后设计方案可能要求增加一些辅助的java API,例如java Mail。
总体设计
l 界面设计:界面的设计要求和oicq大体相同。要求基本实现和它一样的特性,功能上不同的地方可以忽略。不要求实现需要系统相关的功能,例如自动隐藏,如果可以在各平台下实现则进行开发。
l 主要功能:一点对多点的通讯能力,会议模式,二人世界模式,文件传送,ip变更的自动通知能力,自动连接,好友记录,聊天记录,定时自动连接,基本超文本显式能力,黑名单,名片传递,界面更换,头像库自动扩充,暂时下线,隐身。
功能说明
l 一对多通讯能力:一个客户端程序可以和多个其它客户端通讯,在一个ip上可同时存在多个客户端。
l 会议模式:一个客户端可以成为会议主叫方,主叫方在会议模式形成后临时充当会议服务器,负责接收各成员的信息并将之传递到会议中的其它所有成员,主叫方自动成为会议的管理者,可以将其它成员赶出本会议。
l 二人世界模式:已连接的两个客户可以进入二人世界模式,模式的形成需要经过被呼叫方的同意,任何一方可以不经对方同意随时退出此模式,此模式即告结束。在此模式中时的输入基本上立即反应到对方的输出窗口,此窗口是一个独立的窗口,不会影响主程序的执行以及和其它成员的通讯。
l 文件传送:可以进行文件的传递,文件格式没有限制。
l ip变更自动通知:通知的方式待定,考虑使用mail作为中介。另外可以增加服务器方案,ip的变更将通知服务器更新自己的ip信息,以便其它用户在查询服务器时可以得到最新信息。具体见后面的相关说明。
l 自动连接:一方主动连接另一方时不需要经过被呼叫方的同意,但是连接建立后呼叫方在被呼叫方的陌生人里面,而被呼叫方在呼叫方的好友名单里,如果呼叫方的ip或者mail地址符合被呼叫方的某个好友的记录则进入好友名单,并根据规则更新好友记录。规则是如果mail和ip都符合则直接进入好友名单,如果只有ip符合,则提示是否加入好友名单还是覆盖原记录或者不予理会而放入陌生人名单,如果mail符合则检查传送的mail拥有权口令,口令符合则自动更新该好友的ip,不符合则提示是修改该好友的mail拥有权口令而更新ip还是认为该连接是mail冒充而忽略该连接请求。
l 好友记录:记录好友的基本信息。
l 聊天记录:记录聊天内容,文件格式待定。
l 定时自动连接:对于好友名单中的未在线好友定时自动发送连接请求,时间间隔可以设置。
l 超文本显式能力:信息分为普通文本信息和朝文本信息,在信息输入的时候可选,在输入超文本信息的时候可以建立几个小工具以方便输入,格式以标准的HTML标签为准,主要是几个文本格式控制标签,如font、b、I、center、h为主,可以考虑增加几个常用的图片,如表情,花等而添加img标签的使用。另外可以考虑使用的是ul、ol等列表标签的使用,其它未用标签简的内容忽略。
l 黑名单:可以将好友和陌生人加入黑名单,在黑名单中的人的连接请求及信息将被忽略。
l 名片传递:由于连接时传送的基本信息基本不可信,因此对于可信任的好友或者陌生人可以将自己的名片传递给他,接收方自动更新对于记录。一个用户可以设置多个名片,因此名片的真实性不做保证。信息可以分为:基本信息,备注,名片。基本信息是在连接时自动传递的,备注是用户为好友添加的,名片是自动更新的,但是只能保存一个(可能对方有多个)。
l 界面更换:可以使用皮肤库中的不同配色方案。
l 头像库自动更新:用户可以自己收集头像并用于自己,在连接时通知被连接方自己使用的是自定义头像,被连接方根据发送的文件名在自己的头像库中查找是否已经有该头像,有则忽略,否则提示用户是否接收该头像,选择不接收则将该好友的头像设置为缺省头像。
l 暂时下线:用户暂时有事,不能进行正常的聊天,连接不断开,可以向之发送信息,但是不能提交会议、二人世界等需要对方确认的信息。
l 隐身:在已连接时从在线好友名单上显示下线,但是实际连接未断开,还可以进行正常的通讯。如果刚刚启动,则和可建立连接的好友建立连接,但是在对方的在线名单上不显示。
功能开发进度
上面的功能只是考虑的最后需要完备的功能,在开始阶段可以只实现基本的功能,开发顺序是:
1. 一对多,定时自动连接,好友记录,自动连接;这些是最基本的功能,必须完成。
2. ip变更自动通知,文件传送,黑名单,聊天记录;基本扩充功能。
3. 名片传递,会议,二人世界;扩充功能。
4. 超文本,暂时离线,隐身;功能完善。
5. 界面更换,头像库自动扩充;界面完善。

为推广使用而考虑的事情
为了使更多的使用者相互之间知道对方的存在,考虑建立一个服务器,存放用户的基本信息,mail,ip,端口,昵称,性别,年龄,地区,只有mail,ip,端口和昵称是必填的,昵称可以重复,不存储其它信息,必要信息在连接时由连接双方传递。服务器不保证对方的信息是最新的,信息的更新依赖于使用者向服务器提交自己的更新信息,服务器不能向使用者索取,只能等待用户自己提交。服务器不负责各客户端的连接的建立,而仅仅是一个ip信息存储器。用户的ip更新可以自己设置为自动提交和手动提交,在自动提交时,在程序启动时就试图和服务器建立短暂连接,提交自己的ip信息。


以上是开发草案。
请对草案中存在的问题提出改进意见,并对草案的可行性发表看法。
有合作开发兴趣的朋友可以加入:
http://www.smiling.com.cn/group/homepage.ecgi?group_id=27119
...全文
299 26 打赏 收藏 举报
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feigmin 2001-12-19
呵呵
你这个创意和国外现在火的P TO P是一样的(我感觉)
要是真是这样的话,技术难度是非常高的
我在程序员杂志上见过这方面的文章。你去查查吧!
  • 打赏
  • 举报
回复
usstdiy 2001-12-03
想法不错,不过不合实际,变相的使用服务器,如果这样真的能开发出好的东西,其他公司早就行动了.这又不是居于网的游戏,可以乱广播,你就别做梦了
  • 打赏
  • 举报
回复
cherami 2001-11-05
to ecool(扫地的癞蛤蟆):
如果大家都有固定的ip就用不着oicq了。早就有更好的东东了。:)
  • 打赏
  • 举报
回复
cherami 2001-11-05
to chliang() :
看来你没有仔细的看连接说明,或者说没有领会我说的意思。
通过邮件是这样连接的:
假设你有一个邮箱,而且已经在我的好友名单里面。你在今天的上午12点打开了NetCaller,而且你的ip是不定的,假设你是拨号用户,由于你现在的ip变化了,所以你给我发了一个ip地址变更的邮件(包括你的好友名单中的所有人),你一直开着你的NetCaller,而我刚好在12:30也打开了NetCaller,我先接收邮件,发现了你给我的邮件,我提取你的新ip,并且根据这个ip和你建立连接,你说我可以和你建立连接吗?如果我来晚了,你在12:20就关闭了NetCaller,我也收到了你的邮件,但是这时不能和你建立连接,因为你已经不在了。但是因为你不在网络上(NetCaller网络),即使你和我用的是都是oicq我们也一样不能聊天啊!(你在我用oicq之前关闭了oicq)。
  • 打赏
  • 举报
回复
ecool 2001-11-05
哈哈,没有中心节点是不可能成功的,你以为P2p的东东是真的实现了点对点吗?没有一个地址服务器他能?????????????
哈哈哈哈哈哈!!!!!!!还有你当大家都有固定ip的啊
  • 打赏
  • 举报
回复
chl 2001-11-05
假设这儿是我的邮箱,你是2001-11-4 18:37:24给我寄来了你的ip地址,而我是现在才看到你的ip地址,你要我现在用此ip地址跟你聊吗?你在吗?如果你是拨号上网的,ip是不定的,即使你在,我也未必能找到你。
而如果有服务器的话,一切都好了。但在做一个类似qq、oicq的东西确实有意义吗?
  • 打赏
  • 举报
回复
cherami 2001-11-04
欢迎就上面的连接原理提出问题!谢谢!
  • 打赏
  • 举报
回复
cherami 2001-11-04
NetCaller连接原理
说明:
连接的建立过程是这样的,假设的情况是同时使用服务器和mail来进行ip地址变更的通知。
首先:如何获得其它用户的ip?这个在开始时是最难办的,也同时是其它类似软件的共有缺点。oicq在开始用户很少的时候也无法和其它人聊天!如果有服务器,那么通常情况下我们应该假设用户应该愿意和其它人交流而把自己的ip告诉服务器,这样随着用户的增加,可交流的对象也就增多了。如果假设没有服务器,那么我们应该假设的情况是用户使用netcaller的交流对象是自己的同学或者网友或者朋友,它应该知道对方的mail,如果其中一方有一个固定的ip就好办了,只要建立连接是双向的,有固定ip的一端发连接请求给没有固定ip的一端,这通常不能建立连接,但是没有固定ip的一端也同时在发连接请求给有固定ip的那个,这样连接就可以建立并且完成ip变更的通知(在连接建立后首先完成的就是基本信息的交换,包括自己的ip信息),如果都没有固定ip的话就稍微有些麻烦了,还是假设没有服务器,这时通过mail,先启动的一方试图寻找另一方,但是由于对方的ip改变了,这时它通过mail发送自己现在的ip给对方,而且它同时接收mail,看是否有其它好友发来的ip地址变更mail通知,有则提取ip信息,并根据新ip试图建立连接。假设它发送自己的ip变更通知给好友后,提取好友给它的ip变更通知没有结果,那么它只能等待,就像oicq中所有的好友都不在线的情况一样。假设十分钟后,一个好友打开了netCaller,它根据对方原来的ip试图连接但是连接不上,它首先提取mail,发现了对方发来的mail(一般mail可以在发出几分钟甚至一分钟内到达对方的mail服务器),它提取对方新的ip,并建立连接。这样实际上在建立连接上是可行的。

启动后试图建立连接的流程

没有服务器的方案:
1. 启动netcaller
2. 在本机上建立一个ServerSocket线程,可以监听别人的连接请求
3. 连接mail服务器,连接不成功则直接进入下一步,成功则查找是否有ip地址变更邮件(规定特殊的格式,例如在标题中以:netcaller:nickname:ip:mail:mailpasswd为格式,以区别其它普通邮件),有则从mail服务器上读出邮件中的信息并删除服务器上的该邮件并更新对应好友的ip信息
4. 根据好友名单中的ip信息,为每个好友建立一个Socket连接请求线程,每个线程的任务是:如果连接建立成功,线程结束,如果不成功,判断是否成功连接了邮件服务器(由上面一步的一个boolean变量表示),没有成功连接则每隔一定时间(时间长短可以设置,但有一个下限,例如3分钟)重新进行一次连接请求,直到连接成功或者收到ServerSocket线程的连接成功通知,然后结束此线程(或者不循环请求连接而直接结束此线程,因为在双方都没有固定ip而邮件服务器又不能连接的情况下此举毫无用处,但是在不能连接邮件服务器,而对方有固定ip自己没有固定ip的情况下此举是有意义的,可以成功建立连接,或者可以考虑更复杂的方案,对方可以设置自己的ip的属性是固定还是动态的,若是固定的则循环请求,否则直接结束,我比较倾向这个设计);成功连接邮件服务器则比较自己现在的ip和自己上次启动时的ip是否相同,不同则向该好友发送一个自己的ip地址变更通知,然后循环请求连接直到连接成功或者收到ServerSocket线程的连接成功通知,然后结束此线程(此处的设计和上面的类似,可以直接结束,但是在对方有固定ip,但是暂时不能连接邮件服务器,而自己没有固定ip时可以发挥作用,复杂设计和上面的一样)。

此方案的连接成功情况是:
双方都有固定ip:一定可以成功连接,没有其它外部服务器依赖。
一方有,一方没有固定ip:
分几种情况:
没有固定ip的一方的邮件服务器不能用时使用复杂设计可以成功,使用简单设计不一定能成功。但是复杂设计的性能稍稍低一些,可以忽略不计。
有固定ip一方不能连接邮件服务器,使用复杂设计可以连接成功,简单设计不能。性能考虑同上。
都能连接邮件服务器的情况下一定成功连接,两个方案都可以。
双方都没有固定ip:
有一方不能连接邮件服务器则不能连接,否则可以连接,即使使用简单设计。但是如果一方的邮件服务器只是暂时不能用,而如果在邮件服务器不能用时定时重新请求,则是可以建立连接的。

有服务器(仅仅是信息存储服务器)的方案:
1. 启动netcaller
2. 在本机上建立一个ServerSocket线程,可以监听别人的连接请求
3. 连接服务器,连接不成功则直接进入步骤5,成功则比较自己的ip地址和服务器上的信息是否相同,不同则根据设置决定是否发送自己的ip地址变更信息
4. 向服务器发送查询请求,查找好友名单中的ip信息是否变化,变化则提取新信息
5. 连接mail服务器,连接不成功则直接进入下一步,成功则查找是否有ip地址变更邮件(规定特殊的格式,例如在标题中以:netcaller:nickname:ip:mail:mailpasswd为格式,以区别其它普通邮件),有则从mail服务器上读出邮件中的信息并删除服务器上的该邮件并查看是否有从服务器得到的ip新信息,有则根据信息的发送时间决定使用哪个信息更新本机数据(由于对方可以不向服务器提交信息而直接通过邮件仅仅向好友提交信息,所以邮件中的信息可能比服务器上的信息新)
6. 根据好友名单中的ip信息,为每个好友建立一个Socket连接请求线程,每个线程的任务是:如果连接建立成功,线程结束,如果不成功,判断是否成功连接了邮件服务器(由上面一步的一个boolean变量表示),没有成功连接则每隔一定时间(时间长短可以设置,但有一个下限,例如3分钟)重新进行一次连接请求,直到连接成功或者收到ServerSocket线程的连接成功通知,然后结束此线程(或者不循环请求连接而直接结束此线程,因为在双方都没有固定ip而邮件服务器又不能连接的情况下此举毫无用处,但是在不能连接邮件服务器,而对方有固定ip自己没有固定ip的情况下此举是有意义的,可以成功建立连接,或者可以考虑更复杂的方案,对方可以设置自己的ip的属性是固定还是动态的,若是固定的则循环请求,否则直接结束,我比较倾向这个设计);成功连接邮件服务器则比较自己现在的ip和自己上次启动时的ip是否相同,不同则向该好友发送一个自己的ip地址变更通知,然后循环请求连接直到连接成功或者收到ServerSocket线程的连接成功通知,然后结束此线程(此处的设计和上面的类似,可以直接结束,但是在对方有固定ip,但是暂时不能连接邮件服务器,而自己没有固定ip时可以发挥作用,复杂设计和上面的一样)。

此方案的连接成功情况是(假设服务器可用,不可用时的情况和没有服务器时上面的方案完全一样):
只要服务器可用,而对方的信息是新的就可以建立连接。只需要使用简单方案。如果考虑去掉用户自由决定是否向服务器提交信息而自动直接提交最新信息时可以保证连接的成功性,但是此举使用户失去一定的自由度,值得商讨。

  • 打赏
  • 举报
回复
cherami 2001-11-04
非常欢迎楼上的尖锐的问题。
首先声明一下,此系统准备了两套方案,一个是完全没有服务器,另一个是使用服务器,但是服务器的功能仅仅局限于存储使用者的基本信息,各个NetCaller只是从服务器查询好友的ip是否更改了。
有服务器的方案很容易解决你提出的不知道对方ip的功能,只有查询服务器就可以了。对吗?
我个人不愿意使用服务器的方案,原因是我不想功能的发挥被局限于服务器的状态和能力。现在的pc的能力已经很强了,该发挥它的能力了!而且这个是一个完全免费的软件,上那儿找一个服务器呢?有商家愿意,他会不增加其它的条件吗?会不增加自己的广告吗?你现在有能力拒绝腾讯的广告吗?
现在解释一下没有服务器的情况,在开始的时候,这个软件的使用者肯定会在朋友圈里面使用,他们彼此是相互相信的,并且往往使用mail通讯,如果一个问另一个,你在用NetCaller吗?对方回答,我在用啊!告诉我你的ip!!对方会不会告诉他?我想会的。现在我们还会有一些网友,之间也用mail通讯?他们之间呢?他们会不会有可能将自己好友的ip告诉自己的网友呢?如果NetCaller确实像我开始构想的那么好用,大家也承认,那么是否会形成一个社区,并且大家在上面公布自己的ip能?
这些只是乐观的估计,如果我们做的东西不好,情况就不一样了。:(
使用这个不用安装jdk吧,需要的仅仅是一个jre或者jvm,这个在当前的操作系统上可能除了windows xp外都带吧?如果经过考察确实需要外部的其它辅助类库,我想在发布NetCaller的发布包里面会加上的。这个有问题吗?
关于java运行速度慢的问题,我个人的感觉是java程序在启动的时候确实很慢,但是启动后呢?我的感觉是启动后的速度不会比c程序的速度慢多少?不知道你有没有运行过jdk带的那些演示程序,java2d,java3d,swingset2这些在启动的时候很慢,但是启动后呢?我感觉不出来有什么慢?而且效果令人炫目。这也是我之所以想做一个java的NetCaller的原因,其实已经有一个vc做的NetCaller的原型,是我刚到公司的时候练习的项目,所不同的是我们是在局域网里面测试的,而且使用的是udp的方式,而不是java版使用的Socket方式。我想,如果NetCaller好用,你应该会愿意花上1分钟来等它启动完毕,就像在使用JBuilder5时所遇到的情况那样!对吗?
如果对我的回答有不满意的地方,请指出!谢谢。
  • 打赏
  • 举报
回复
chl 2001-11-04
好了,终于说到点子上——不使用服务器。不使用服务器怎样实现你所讲的好像qq那样的功能呢?就是连人家的ip地址也不知道啊,端到端怎样实现?

另外,难道你要所有用户都下载一个jdk来用你的软件?再加上java运行慢,你又不是不知道,你准本怎样克服?
  • 打赏
  • 举报
回复
cherami 2001-11-04
to :yuppy_lew(yuppy_lew)
能给出具体的地址吗?我这里到是有一个类似的东西,作者叫它jicq,而且也在这个论坛给出了帖子请大家帮他扩充。但是我的考虑和他的有效不同,NetCaller的构思是客户端直接的通讯,不使用服务器。
  • 打赏
  • 举报
回复
cherami 2001-11-04
to:steeven(steeven)
目前考虑到前期的开发的简单,没有考虑使用xml,而且我也刚刚学了一点xml,所以。。。如果有xml高手加盟开发小组,可以考虑将消息以xml格式表示。
  • 打赏
  • 举报
回复
cherami 2001-11-04
to:steeven(steeven)
我也仅仅是刚学了一点xml,但是考虑到前期开发的简单,目前没有考虑,如果有xml高手加盟的话,可以考虑消息的xml格式化。
  • 打赏
  • 举报
回复
yuppy_lew 2001-11-04
网上已经有用JAVA实现的类似于QQ的CODE下载了
可以找来参考一下啊
  • 打赏
  • 举报
回复
steeven 2001-11-03
只是一个简单建议,我也刚刚了解xml :)

如果不考虑效率的话, xml会成为一个开放接口, 并且非常方便以后扩充
xml的扩充能力很强,增加什么功能只要加一个新的字段, 旧版本也不会因此而不兼容

如果有人写其它版本的NetCaller也可以根据dtd简单完成.一个开放的接口可以鼓励不同的人分头在不同的系统上用不同语言分别完成客户端和Server

另外,icq, oicq都要求有专用server,可否用其它方式来完成一个松散的server组合,并且很容易实现,比如在http上用cgi就能做server. 这样局域网也可以构建一个小系统.松散的server直接可以通过客户端和其它方法来相互了解,分担负载.

没仔细看你的计划,胡说几句 :)
  • 打赏
  • 举报
回复
cherami 2001-11-03
to:steeven(steeven)
能不能说详细一些?你的意思是将信息以xml格式进行传输而后转换为其它格式吗?
  • 打赏
  • 举报
回复
steeven 2001-11-03
能不能用xml做传输中介?
  • 打赏
  • 举报
回复
cherami 2001-11-03
已经出台:
NetCaller的版权及其它说明
NetCaller的开发方式说明
NetCaller连接原理
并对提出的几个问题给出解决方法。
欢迎加入,欢迎提出意见。
详细情况请查看
http://www.smiling.com.cn/group/homepage.ecgi?group_id=27119 NetCaller开发小组
  • 打赏
  • 举报
回复
cherami 2001-11-03
软件完全是free的,而且源代码开放。
开发的目的只是练习java的知识,另外也可以给自己和别人提供一个方便的聊天工具。可以在windows和linux平台下完全一样的使用。
  • 打赏
  • 举报
回复
magus_yang 2001-11-02
这个软件的定位是share还是free?

如果能在手机上开发客户端,或许会变得很有趣。
  • 打赏
  • 举报
回复
加载更多回复(6)
相关推荐
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2001-11-02 01:51
社区公告
暂无公告