- 浏览: 173330 次
- 性别:
- 来自: 宁波
文章分类
- 全部博客 (113)
- EJB3.0 (1)
- Spring+Hibernate+Struts2 (7)
- 杂谈 (27)
- ExtJs2.2 (1)
- 设计模式 (1)
- JBoss Seam (0)
- 以前在学校里学习的笔记 (3)
- 我的智能手机研究文章 (2)
- DIV+CSS美化页面 (6)
- javascript (7)
- POI操作 (2)
- 数据库 (8)
- Tomcat服务器 (2)
- 测试 (3)
- 水区 (5)
- c++ (1)
- 工作流 (0)
- osg (0)
- JS技术 (2)
- ubuntu linux (3)
- svg (1)
- android (17)
- PHP (1)
- webservise (1)
- java (1)
- mongdb (0)
最新评论
-
flytosea:
如果LIB包建立在外面的话,maven不能把jar一起打包
maven 不建立仓库直接加入直接的jar -
javaAlpha:
楼主 总结的太全了。
CSS兼容IE6,IE7,FF的技巧
一、 总的构架结构示意图:
如上图所示,目前系统总的分成六个模块,分别为网络/协议解析模块,用户帐号管理模块,消息处理模块,动作处理模块,数据均衡处理模块,客户状态处理模块。
正常流程应该这么实现,以一个或者几个线程运行网络/协议解析模块,然后他根据具体的包类型分发给具体的命令处理模块,每个具体的命令处理模块至少应该分别运行于不同的线程。
从上面的结构图可以看出,其中客户状态模块和网络/协议解析模块都是公用模块,其他的模块几乎都依赖于这两个模块。目前因为很多功能不予以实现,例如不实现离线消息,所以只有用户帐号管理模块跟数据库相关。
二、 每个模块的具体功能描述
1. 用户帐号管理模块:
该模块管理基于用户帐号的所有操作:具体由如下:创建用户,删除用户,修改用户资料,修改用户密码,得到用户个人信息,得到好友列表,登陆,登出,请求认证串,创建群组,加入群组,离开群组。
以上所有操作,除了创建用户不需要登陆外,其他的任何操作都必须是已经登陆的用户,所以必须先有登陆操作,才能进行下一步的操作,这条规则针对所有的命令都是。
描述一下登陆过程:
客户端发送命令请求得到认证串——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块——〉用户帐号管理模块自动生成一个随机认证串,同时把该客户端的用户标志一起保存在列表中(在列表中该数据只能保存一分钟,超过则删除,因此客户端必须在一分钟内利用此认证串登陆),同时把认证串由网络/协议解析模块发送给客户端——〉客户端把用户名和认证串、用户名、密码组成的新串的MD5一并发给服务器请求登陆——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块——〉用户帐号管理模块首先检查列表中是否有该用户标志的数据,如果有则继续——〉从数据库中取出用户名和密码,然后从列表中取出认证串,生成MD5,看是否一致,如果一致,则表示登陆成功,服务器生成会话加密密钥,以后的所有与服务器的会话信息都采用此密钥加密和解密——〉网络/协议解析模块把结果发送给客户端,如果成功——〉网络/协议解析模块把该用户的用户标志和会话加密密钥保存在客户状态模块中。
2. 网络/协议解析模块:
网络解析模块应该保存一个最近的登陆用户列表的缓存,该列表保存的信息应该有IP和端口,还有加密密钥,最后一次访问的时间。在该列表的用户,如果超过一定时间(例如一分钟)没有访问,就要从该列表中删除。该列表的主要用途用于快速的查找登陆用户(这样频繁访问服务器的用户登录检查就不需要丛客户状态模块中查询了,提高效率),如果在此列表中查找不到,则向客户状态模块查找,如果找到了,则把用户添加到此列表中。如果找不到,则表示不在线。
任何时候收到用户的消息,则要更新登陆用户列表的缓存中的最后访问时间数据,如果该用户不在列表中,但是最后检查已经登陆,则要添加。还有心跳命令不应该影响该列表的用户数据。但是心跳命令会影响客户状态列表。
网络解析模块应该保存一个用户标志映射列表(也可以直接组合他们的数据地址),把客户端的IP地址和端口映射到一个具体的唯一客户端标志值,然后这个值以后作为这个客户端的标志,各个具体模块对客户端的任何操作都以这个标志为基础。
有四个功能
第一,根据不同的类型把数据报解密后(如果需要解密)分发给各个具体的处理模块。在分发前,首先检查该用户是否登陆,如果没有,则直接告诉客户端一个错误。对于新建用户,登陆命令,获取认证字符串的命令不需要检查是否已经登陆。
第二,自己处理相关的消息,目前自己处理的消息包括心跳消息和客户端请求建立直连的命令,还有任何数据包的格式不对或者版本不对的情况处理,则该模块自己就处理了。
第三,把用户发送消息时的状态提交给客户状态模块,其中包括用户唯一标志。如果用户在发送消息时,地址已经修改了,那么唯一标志必须保持不变,但是用户标志列表中的用户地址数据必须跟着修改。
第四,包各个模块发送给客户端的消息加密后(如果需要)处理发送给客户端。
3. 客户状态模块:
该模块的功能如下:
第一、 保存并操作所有当前在线的用户信息,包括用户的登陆时间,用户标志,用户状态(隐身等),用户帐号。提供给其他模块查询某个用户是否登陆。
第二、 处理获取在线好友的消息,如果收到此命令,则通过用户帐号管理模块查找该用的好友列表,同时查找当前的在线用户列表,然后就得到在线好友列表。
第三、 处理用户状态改变的命令,如果收到用户的状态改变消息(如登录、登出、隐身等),则查找该用户的在线好友列表,然后一一通知。
第四、 如果长时间没有收到用户的消息,则认为该用户因为意外的原因而断线,则自动认为登出。客户端在没有任何消息需要发送时,会定时的向服务器发送心跳命令,告诉服务器客户端在线,如果连续一段时间没有收到心跳信息,则认为用户已经断线。
第五、 保存并操作在线群组信息。给其他模块提供获取特定群组或者场景中的用户列表功能。
4. 消息处理模块:
处理所有的消息转发,包括群消息,好友消息。
对于好友消息,该消息处理模块首先通过客户状态模块检查好友是否在线,如果在线,则把好友消息发送过去,如果不在线,则不发送。
对于群消息,如果是针对普通的群组消息,则通过客户状态模块得到该群组的在线用户列表,然后给每个人发送该消息,除了自己。
如果是场景中的公有消息,则先检查该用户所在场景的位置,然后计算出能够听到该用户的场景中的其他用户的用户列表,然后给每个人发送消息。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特定场景中的用户才参与运算。
注意:对于场景消息,如果客户端不是以场景方式登录的,那么就不能发送和接收场景消息。
除了以上的消息,还有广告消息,系统消息之外客户端可以接受外,陌生人不能互发消息,如果服务器接受到此列消息,必须忽略,不发送任何应答。
5. 动作处理模块:
处理所有场景动作,该消息只有场景用户方式登录的才能发送和接收动作命令。服务器接收用户的动作命令,计算出用户所在的场景中能够看到的人的列表,然后一一发送命令给该用户。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特定场景中的用户才参与运算。
该模块中保存有一个用户的位置和动作状态表(包括是否在某个特定的场景里面信息),保存场景用户的所在场景用户的坐标和最后一次的动作状态信息。
场景用户登录后,位置每更新一次,都必须把该用户所在的场景位置坐标发送给服务器,对于心跳信息和动作信息不需要携带位置坐标数据。
6. 数据均衡处理模块:
该模块主要为了分布式处理,服务器负载平衡而设计,主要发出网络服务器重定向的命令,对于这些命令,所有客户端都必须处理,因为一旦服务器发出了这个命令后,就在此服务器不再保存该用户信息了。
目前该模块不实现。
如上图所示,目前系统总的分成六个模块,分别为网络/协议解析模块,用户帐号管理模块,消息处理模块,动作处理模块,数据均衡处理模块,客户状态处理模块。
正常流程应该这么实现,以一个或者几个线程运行网络/协议解析模块,然后他根据具体的包类型分发给具体的命令处理模块,每个具体的命令处理模块至少应该分别运行于不同的线程。
从上面的结构图可以看出,其中客户状态模块和网络/协议解析模块都是公用模块,其他的模块几乎都依赖于这两个模块。目前因为很多功能不予以实现,例如不实现离线消息,所以只有用户帐号管理模块跟数据库相关。
二、 每个模块的具体功能描述
1. 用户帐号管理模块:
该模块管理基于用户帐号的所有操作:具体由如下:创建用户,删除用户,修改用户资料,修改用户密码,得到用户个人信息,得到好友列表,登陆,登出,请求认证串,创建群组,加入群组,离开群组。
以上所有操作,除了创建用户不需要登陆外,其他的任何操作都必须是已经登陆的用户,所以必须先有登陆操作,才能进行下一步的操作,这条规则针对所有的命令都是。
描述一下登陆过程:
客户端发送命令请求得到认证串——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块——〉用户帐号管理模块自动生成一个随机认证串,同时把该客户端的用户标志一起保存在列表中(在列表中该数据只能保存一分钟,超过则删除,因此客户端必须在一分钟内利用此认证串登陆),同时把认证串由网络/协议解析模块发送给客户端——〉客户端把用户名和认证串、用户名、密码组成的新串的MD5一并发给服务器请求登陆——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块——〉用户帐号管理模块首先检查列表中是否有该用户标志的数据,如果有则继续——〉从数据库中取出用户名和密码,然后从列表中取出认证串,生成MD5,看是否一致,如果一致,则表示登陆成功,服务器生成会话加密密钥,以后的所有与服务器的会话信息都采用此密钥加密和解密——〉网络/协议解析模块把结果发送给客户端,如果成功——〉网络/协议解析模块把该用户的用户标志和会话加密密钥保存在客户状态模块中。
2. 网络/协议解析模块:
网络解析模块应该保存一个最近的登陆用户列表的缓存,该列表保存的信息应该有IP和端口,还有加密密钥,最后一次访问的时间。在该列表的用户,如果超过一定时间(例如一分钟)没有访问,就要从该列表中删除。该列表的主要用途用于快速的查找登陆用户(这样频繁访问服务器的用户登录检查就不需要丛客户状态模块中查询了,提高效率),如果在此列表中查找不到,则向客户状态模块查找,如果找到了,则把用户添加到此列表中。如果找不到,则表示不在线。
任何时候收到用户的消息,则要更新登陆用户列表的缓存中的最后访问时间数据,如果该用户不在列表中,但是最后检查已经登陆,则要添加。还有心跳命令不应该影响该列表的用户数据。但是心跳命令会影响客户状态列表。
网络解析模块应该保存一个用户标志映射列表(也可以直接组合他们的数据地址),把客户端的IP地址和端口映射到一个具体的唯一客户端标志值,然后这个值以后作为这个客户端的标志,各个具体模块对客户端的任何操作都以这个标志为基础。
有四个功能
第一,根据不同的类型把数据报解密后(如果需要解密)分发给各个具体的处理模块。在分发前,首先检查该用户是否登陆,如果没有,则直接告诉客户端一个错误。对于新建用户,登陆命令,获取认证字符串的命令不需要检查是否已经登陆。
第二,自己处理相关的消息,目前自己处理的消息包括心跳消息和客户端请求建立直连的命令,还有任何数据包的格式不对或者版本不对的情况处理,则该模块自己就处理了。
第三,把用户发送消息时的状态提交给客户状态模块,其中包括用户唯一标志。如果用户在发送消息时,地址已经修改了,那么唯一标志必须保持不变,但是用户标志列表中的用户地址数据必须跟着修改。
第四,包各个模块发送给客户端的消息加密后(如果需要)处理发送给客户端。
3. 客户状态模块:
该模块的功能如下:
第一、 保存并操作所有当前在线的用户信息,包括用户的登陆时间,用户标志,用户状态(隐身等),用户帐号。提供给其他模块查询某个用户是否登陆。
第二、 处理获取在线好友的消息,如果收到此命令,则通过用户帐号管理模块查找该用的好友列表,同时查找当前的在线用户列表,然后就得到在线好友列表。
第三、 处理用户状态改变的命令,如果收到用户的状态改变消息(如登录、登出、隐身等),则查找该用户的在线好友列表,然后一一通知。
第四、 如果长时间没有收到用户的消息,则认为该用户因为意外的原因而断线,则自动认为登出。客户端在没有任何消息需要发送时,会定时的向服务器发送心跳命令,告诉服务器客户端在线,如果连续一段时间没有收到心跳信息,则认为用户已经断线。
第五、 保存并操作在线群组信息。给其他模块提供获取特定群组或者场景中的用户列表功能。
4. 消息处理模块:
处理所有的消息转发,包括群消息,好友消息。
对于好友消息,该消息处理模块首先通过客户状态模块检查好友是否在线,如果在线,则把好友消息发送过去,如果不在线,则不发送。
对于群消息,如果是针对普通的群组消息,则通过客户状态模块得到该群组的在线用户列表,然后给每个人发送该消息,除了自己。
如果是场景中的公有消息,则先检查该用户所在场景的位置,然后计算出能够听到该用户的场景中的其他用户的用户列表,然后给每个人发送消息。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特定场景中的用户才参与运算。
注意:对于场景消息,如果客户端不是以场景方式登录的,那么就不能发送和接收场景消息。
除了以上的消息,还有广告消息,系统消息之外客户端可以接受外,陌生人不能互发消息,如果服务器接受到此列消息,必须忽略,不发送任何应答。
5. 动作处理模块:
处理所有场景动作,该消息只有场景用户方式登录的才能发送和接收动作命令。服务器接收用户的动作命令,计算出用户所在的场景中能够看到的人的列表,然后一一发送命令给该用户。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特定场景中的用户才参与运算。
该模块中保存有一个用户的位置和动作状态表(包括是否在某个特定的场景里面信息),保存场景用户的所在场景用户的坐标和最后一次的动作状态信息。
场景用户登录后,位置每更新一次,都必须把该用户所在的场景位置坐标发送给服务器,对于心跳信息和动作信息不需要携带位置坐标数据。
6. 数据均衡处理模块:
该模块主要为了分布式处理,服务器负载平衡而设计,主要发出网络服务器重定向的命令,对于这些命令,所有客户端都必须处理,因为一旦服务器发出了这个命令后,就在此服务器不再保存该用户信息了。
目前该模块不实现。
发表评论
-
maven 不建立仓库直接加入直接的jar
2012-10-26 10:45 1417<dependency> <grou ... -
HTTP协议详解(真的很经典)
2011-02-16 14:16 1135引言 ... -
git中文资料
2011-02-16 10:06 1139Git入门教程 http://hi.baidu.com/eeh ... -
北京圣思园视频下载及时跟新
2011-01-25 11:44 1780北京圣思园张龙(风中叶)老师的Java Web培训的视频,咨询 ... -
二分查找
2010-12-07 13:11 878public class TestBinSearch { ... -
FlashFXP
2010-12-06 09:48 705-------- FlashFXP Registration ... -
Netbeans 6.9.1 设置为英文界面
2010-11-22 09:29 1141问题:从官网下载的netbeans不论是中文版还是英文版默认的 ... -
Fat jar 非常不错的打包插件
2010-08-25 06:30 774http://fjep.sourceforge.net/ -
实践与共享:微软近日发布麾下杀毒软件最新版本 Microsoft Security Essentials 2.0 中文版
2010-08-13 12:22 870近日,微软将其麾下杀毒软件“MSE”升级到了V2.0.3 ... -
推荐Swing编程学习网站
2010-08-12 19:20 887本人向大家提供几个个Swing学习交流的平台 swingch ... -
“第六感装置”的惊人潜力
2010-03-19 23:13 1025我们总是在于“现实生活”和“电脑的数字生活”中的差异,这两个世 ... -
vim笔记
2010-01-04 16:48 836vi的模式mode NormalMode :命令模式,使用a、 ... -
IntelliJ Idea 常用快捷键
2009-10-08 20:41 717Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ct ... -
Eclipse提高工作效率的好习惯
2009-09-09 10:38 896Eclipse 快捷键设置-更 ... -
共享内存在Java中的实现和应用
2009-07-14 17:21 928共享内存在Java中的实现 ... -
jsp笔记
2009-07-14 17:17 629JSP 的9 个内置对象 application: java ... -
命令文档
2009-07-09 20:58 819net use \\ip\ipc$ " " ... -
[转]常用正则表达式收集
2009-06-24 14:35 818正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常 ... -
Url Rewrite Filter 3.1.0
2009-06-23 14:26 3466http://urlrewritefilter.googlec ... -
Excel中如何一次性去掉多个超链接
2009-06-15 17:44 29311.点击“宏”→“查看宏”,选择“宏名”下的“RemoveHy ...
相关推荐
自建IM服务器的猿学习App的设计与实现 在当今数字化时代,移动学习变得越来越流行,而即时通信技术是移动学习的关键组件之一。然而,国内的即时通信服务器大多数是由其他大厂进行派发的,需要进行二次开发,用户...
java开发,基于开源的IM及时通讯服务器
IM客户端与服务器是即时通讯(Instant Messaging)系统的核心组成部分,它们负责实现用户之间的实时通信功能。在这个VC7编写的项目中,重点在于UDP打洞技术和可靠性的UDP数据传输,这些都是在P2P(点对点)网络环境...
《Go-goim:基于Golang构建的高效IM服务器详解》 在现代互联网应用中,即时通讯(Instant Messaging,简称IM)已经成为不可或缺的一部分,无论是企业内部沟通还是社交平台,IM服务器都扮演着至关重要的角色。Go-...
- **协议设计**:IM系统可能需要自定义的通信协议,用于数据的编码和解码,比如XML、JSON或二进制格式。 - **消息队列**:为了保证消息的有序和可靠传递,服务器可能会使用消息队列(如ActiveMQ、RabbitMQ等)。 ...
标题“web-im.rar_React_im_im服务器_react_openfire”暗示了一个基于React的Web即时通讯(IM)项目,其中使用了Openfire作为后端服务器。这个项目可能包含了实现单聊和群聊功能的所有必要组件和配置。让我们深入...
首先,52im即时通讯系统的核心在于其服务器端,即"RainbowChatServer"。这是一个高性能的聊天服务器,它采用了先进的网络通信框架Netty,能够处理大量的并发连接,确保在高负载下的稳定运行。Netty的非阻塞IO模型...
首先,从标题来看,“imim.zip_imim-user-194177_imim-user-237221_imim-user-444202_imim”可能是用户ID的组合,暗示这可能是一个社区共享的代码资源,由多个用户参与讨论或改进。其中,“imim”可能是项目名或特定...
基于Qt+C++开发的IM即时通讯设计高并发聊天服务源码+服务器+客户端+环境配置+开发文档说明,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt+C++开发的IM...
- 详解J-IM自定义Socket协议结构:了解J-IM如何通过自定义Socket协议结构进行消息传输。 - 引入jim-common公共开发包:引入公共包以便客户端和服务端代码复用。 - 定义Packet:定义消息数据包的结构。 - 定义客户端...
**即时通讯服务器基础** 即时通讯(Instant Messaging,简称IM)服务器是用于实现实时通信的应用程序,它...开发者可以通过学习和研究这个项目,深入了解IM服务器的架构设计和关键技术应用,进一步提升自己的技能。
小米IM通讯服务器架构图
Go-imgo是一个基于Goim构建的高性能、高可用的推送服务器和即时通讯(IM)服务器。Goim本身是一个用Golang语言开发的开源项目,它为开发者提供了构建大规模实时通讯系统的能力。在深入探讨Go-imgo之前,我们先来了解...
MSN系统采用基本的客户端/服务器结构进行即时通 信,用户之间的文本消息需要经过MSN服务器中转。MSN消 息传输遵循MSNP协议。根据MSNP8协议标准,输出消息被 封装为以下格式:消息命令字MSG +事务ID +希望确认类 型+有效...
在本文中,我们将深入探讨如何使用C#编程语言创建一个即时消息(IM)客户端程序,以便连接到服务器并实现登录功能。C#是一种强大的、面向对象的编程语言,非常适合开发网络应用程序,包括IM系统。 首先,我们需要...
### IM结构流程及通讯接口详解 #### 用户上线流程解析 在深入探讨IM(即时通讯)系统内部结构及其通讯接口之前,我们首先理解一下用户上线这一关键环节的基本流程。这一过程涉及多个步骤,从用户端的启动到服务器...
"百度HI - IM源码(服务器+客户端+数据库)一套" 这个标题揭示了我们要讨论的核心内容:一套完整的即时通讯(IM)系统的源代码,包括服务器端、客户端以及数据库部分。百度HI是百度公司推出的一款即时通讯软件,类似...
基于Qt+C++开发的IM即时通讯设计高并发聊天服务源码+服务器+客户端+环境配置+开发文档说明(高分项目&毕业设计&期末大作)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单...
描述中提到的"稳定性好",意味着这个IM系统在设计和实现时考虑了系统的可靠性和健壮性,能够保证在各种网络环境和高并发情况下稳定运行,不会轻易出现崩溃或数据丢失的情况。 关键词"通讯,即时通讯"是这个项目的...