怎么实现一个oicq一样的icq系统?(100分)

  • 主题发起人 主题发起人 邹光先
  • 开始时间 开始时间

邹光先

Unregistered / Unconfirmed
GUEST, unregistred user!
1、是用udp好呢还是tcp好呢?
2、用udp怎么确定一个用户还在线上?难道要定时发消息确认?
由服务器发好还是client发好?
3、用udp的话,需不需要自己封装udp的接受函数,以判断接受的
消息是否完整?有什么其他的校验方式?
4、服务器端是不是只有自己写响应udp的多线程了?
6、tcp/ip协议来做的话,一台机器上同时最多能接受多少个连接?
资源开销大不大?比起udp来说呢?
5、大家有没有更好的方式来建立这个系统?
6、其他问题我编制过程中再来请教大家。:)
7、能不能提供一个开发模型?
 
1、TCP好,连接可靠
2、客户端发好,减少服务器负担
3、。。。
4、。。。。
5、由主机带宽决定,具体开销看设计模型。
 
1, 象ICQ等用的是UDP
2,Client
 
对了 ,udp一次能发多少个字节?
 
一次发多大由isp规定了,1.5k左右
udp不要发太大,越大越不可靠

tcp,如果用户太多则不好。用户少则比udp好。

用udp的话,客户应该隔一段时间向服务器发确认消息

可以使用 ics 控件来完成(delphi带的控件比较糟糕)
 
呵呵
我才做了一套Client/Server 类OICQ的东西。
客户端和主机联系用UDP协议
客户端之间联系用TCP协议

服务器吃不消众多的Tcp连接的
UDP属于发送后不管协议,用于大量数据的处理很有效
事实上很多IP电话软件也都是用的UDP协议,这样对服务器开销小
同时客户端之间用TCP连接可以达到消息的实效性,之间传输大文件时也
可以保证最大的可靠性
 
nuke,能不能把你的代码发一份给我?谢谢了.weck@chinaren.com
 
有什么问题尽管问我
要是我把原代码外泄的话....
呵呵,那老板要杀了我.
:(
 
可以讲一讲大致思路吗?
 
是呀大家欢迎Nuke讲讲结构和框架

我觉得用UDP比较好
UDP握手速度快,连接迅速,就是容易丢
TCP的稳定性很好,不过连接一次费劲,如果不保持长时间的连接,
断开后又要反复连接

还是两端对发确认比较好,两端可以都知道相互的状态

我用的感觉ICS比Delphi自带的好

自己写函数接受也行,不过比较麻烦,那样还不如从写一个控件 :P
 
呵呵,具体框架就和普通的C/S一样,
服务器搞个数据库,再加个UDP消息处理部分,很简单
客户端登录时向服务器确认,同时查询朋友列表上的各个用户的状态。
用户之间要进行交流时动态Create Socket进行TCP连接(交流完成后也无须断开)

好象就这些吧,大家别想得太悬乎,不难的,就是细节考虑得要比较多。

UDP一般传小包也不会丢包,呵呵,放心用就是

至于控件么,ICS是不错,不过用Delphi5自己带的控件也就可以了。
我就是全部使用Delphi的自带控件完成的
只不过界面部分使用了自己写的一些控件。


 
太平洋电脑城网站上说,现在最流行的ociq是UdP,好象不太安全
 
应用tcp,udp不安全!在网络状况不好时有可能丢数据!而且如果某个人用程序连续向你发送upd数据报,一但你的udp缓充区溢出,那么所有的内容将丢失!(虽然可已将缓充区设大,但也起不了太大用)。另外udp数据报可以隐藏源ip,你将不知道是谁攻击的!!udp现在一般用在tcp不支持的广播和多播中。
可行的方法是在server端采用多线程,每客户一个线程,共享内存,记录在线用户!如server端负载较大,可将server分部!前端多个server,接收客户端的tcp,后端一个server,在共享内存中记录在线用户,前端server和后端server进行通信(此连接要一开始建立,不要断开,一直保持连接,可提高效率)。
icq这种程序的瓶径主要在于一台server可同时分配的socket描术字数,源自berkeley的系统最大值为1024!winnt这部分是抄的berkeley的实现!udp和tcp都要占用socket描术字,都有此限制!只不过udp不进行三路握手而已!!
在server端一定要才用unix操做系统,我在 winnt试过,太次了!!
 
???
呵呵
ICQ,OICQ,PCICQ,MyICQ....都是采用我说的那种方式
单单一个ICQ服务系统有必要用UNIX么?
:)

这种程序考虑的并不是数据的有效性,而在于数据的即时性,更重要的是要
考虑服务器的开销
如果有四万个用户同时在线,每个用户建立TCP连接,呵呵...
吃不消啊



 
我可以简要的介绍一下,我用netxtray跟踪的oicq的实现方式.
首先整个系统可以分为三部分,Client,Name Server,
Chat Room Server,oicq是这样实现的,
首先,Client向Name Server发送请求(udp包),登录名字服务器,这时名字服务器,
负责向所有登录的用户广播这一用户上线的消息(udp),
并向所有的这个用户的好友传递这个用户的ip地址,这样就可以知道谁上线了.
如果进聊天室聊天,首先向Name Server发出一个udp包,请求所有可能的
聊天室服务器列表,并同时得到这些服务器的ip,以及tcp协议的端口,
这种做法有利于随时加入Chat Room Server.然后和Chat Room Server
建立tcp连接,这是必要的,因为tcp可以是实时的,这样能保证先说的话先到达,
而不是像udp那样,不知道哪个先到达.然后有关聊天室的问题都交给
Chat Room Server来做.
如果想直接向某一好友发送消息,怎可以使用udp,因为没必要建立连接.
还有就是二人世界则可以建立一个双向的tcp.
如果你有不明白的地方,可以自己去监视一下,很容易看懂.
 
to: czhuohuo

有没有netxtray,能否给我发一份
mail to: kug@990.net
 

┌───┐ 每隔s秒向服务器发出确认信息  ┌───┐
│   │←─────────────────────┤   │
│服务器├─────────────────────→│客户端│
│   │ 收到确认信息后根据前2s秒接收到的确认信息 │   │
└───┘确定在线用户数并将数据包Info(包含在线人数与 └─┬─┘ 
  ↑     对方呼叫等信息)传回客户端      │
  │                        │
  │  客户端向服务器发出对另一客户的呼叫信号   │
  └──────────────────────────┘   
服务器记录呼叫信号,在接到被呼叫方确认信号后将呼叫信号
置于Info中传予被呼叫方

服务器与客户端采取无连接方式相互发送数据包。
客户间交流利用点对点连接。
 
merlin,有5M,你还想要吗?
自己去找光盘吧
 
后退
顶部