!!!!讨论OICQ的实现方法

playpcgame 2000-09-10 08:16:00
请大家讨论OICQ的实现方法,如体系结构,负载均衡,消息的传递,各版本之间的协同等等。分数多多,不够可以再加!!
...全文
1540 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuzhouqun 2000-09-23
  • 打赏
  • 举报
回复
关注!
raincy 2000-09-19
  • 打赏
  • 举报
回复
基于tcp的设计应该是编起来比较方便,除了第一次连接建立的时候比较慢,
以后的消息发送的速度是有保障的,所以在点对点的聊天的时候,采用tcp连
接应该是一种不错的选择.
至于服务器采用udp连接,我觉得可能适因为服务器端为保留太多的tcp信息
而使系统的运行效率下降.采用udp在这个时候有明显的优势.
dcrwy 2000-09-19
  • 打赏
  • 举报
回复
我的观点:
1.实际上用TCP可能更安全些,但是UDP更适合聊天软件。
2.OICQ与客户端的不断联系可能是通过一台专用服务器。
3.一个端口足够了,可以使用进程、线程。
4.OICQ还有很多缺点
5.无商不奸,如果有自杀功能了,那。。。
Putao 2000-09-19
  • 打赏
  • 举报
回复
OICQ得成功不仅是因为软件写得好,还有强大的网站支持
netsong 2000-09-18
  • 打赏
  • 举报
回复
怎么没人讨论了?
potatopro 2000-09-15
  • 打赏
  • 举报
回复
kingwill 2000-09-15
  • 打赏
  • 举报
回复
attention
playingmygame 2000-09-15
  • 打赏
  • 举报
回复
take care^_^
flywhc 2000-09-14
  • 打赏
  • 举报
回复
刚好前一段做完了一套类ICQ系统
其实OICQ从内核上看还不完善 -- 至少我觉得不如ICQ好。

OICQ用的UDP和TCP混合编程。我开始以为TCP比较好,比较稳定,
只是稍占资源,服务器端编程困难一些;后来在PROXY后面做测试才发现
UDP协议的好处 -- 多数PROXY软件都支持UDP MAPPING,这样根本无需什么SOCK4、5
就能连出去了。要想支持TCP,必须用SOCK5,一种很“麻烦”的协议,每次建立一个
连接都要建立另一个与SOCK5端口的确认、请求、分配等手续。
于是在单位里用OICQ最麻烦的就是在PROXY后面不能传文件(因为用的TCP协议)

于是我把所有TCP协议都干掉了,全部用一个UDP SOCKET收、发,特省资源。CLIENT的PORT
没必要规定,随机分配就好。这样只要网管开了8000端口,程序根本不用区分是在PROXY外面还是里面。但UDP协议太不稳定了,丢、重、错包都常常发生,必须自己定义数据包格式,必须加校验,必须加时间戳判断。数据重发应该更智能一些,不该是3秒一次。尤其对于文件传输,国内的ICQ系统都做的不怎么样,太慢了,没有自动调速自动续传的机制,应该好好看看ZMODEM之类的算法。

关于服务器端的线程,目前我还是用单线程,因为非阻塞方式的网络操作很快,数据库也很快,甚至可以忽略。如果用户量很巨大,可以用分布式的,把一台服务器做专门的数据库服务器。至于如何把负载分到各个服务器上,我不懂网络通讯,但我的办法是在client有个服务器列表 -- 甚至可以自动更新,登录时向各服务器发请求,哪个先回认为哪个最快;当连不上时自动切到另一个再试;并自动调整顺序。以前的ICQ好象就是这么干的,现在的不知道。

确定某用户是否在线、离线,除登录时由服务器刷新告之外,比较好的算法是由好友“主动”的告诉client -- 细心的可以发现,如果强制断线的话,ICQ上的用户1分钟仍然在线,如果选“OFFLINE”则立刻掉下去。
solver 2000-09-14
  • 打赏
  • 举报
回复
关注
homesoft 2000-09-13
  • 打赏
  • 举报
回复
关注
shines77 2000-09-13
  • 打赏
  • 举报
回复
更正: 是1XXXX, not 1XXXXX
shines77 2000-09-13
  • 打赏
  • 举报
回复
如果你用UDP探测器侦测会发现,OICQ客户端每一分钟与服务器握手一次,发送UDP Msg时每 3秒发送一次,不断重复,直到对方接受后把已接受的信息发送回来,发送框方才消失。

如果客户端是169需要服务器中转发送信息。
如果是从169传文件到163用户,就根本不可能,因为他们是直接的TCP/IP连接,连接不上。

至于端口嘛,客户端默认是4000,如果占用则随机更换一个,所以如果你发现端口号是1XXXXX以上的,极有可能是来自169网的,因为169的所有用户是共一个IP,而端口不同罢了,有点类似一个网吧的局域网,只不过此网吧的规模大了许多。如果是1XXX,则有可能是用代理上的。

以上仅供参考。
sungang 2000-09-13
  • 打赏
  • 举报
回复
关注
coolcode 2000-09-12
  • 打赏
  • 举报
回复
我想谈谈OICQ的另一面,嘿嘿.
其一.OICQ各种功能都考虑得很周到.却惟独没有此类软件普通存在的自杀(UnRegister)功能.
目的何在?很明显是为了用户数目只增不减.要知道,用户群是此类网站的存在的基础啊.
其二,您有几个OICQ号?3个?4个?还有您早就忘掉的号哩?OICQ号称注册用户1000万.该打多大的折扣?
.......



fourway 2000-09-12
  • 打赏
  • 举报
回复
关注

biner 2000-09-12
  • 打赏
  • 举报
回复
关注
茂奇软件 2000-09-12
  • 打赏
  • 举报
回复
listen.
Sodar 2000-09-12
  • 打赏
  • 举报
回复
to zhonglei:

socks4提供connect和bind功能,具体说来connect就是内部主机可以通过socks4代理连接到远程主机,bind命令是向代理服务器申请绑定一个端口,然后把代理绑定的端口通过某种手段通知远程主机,远程主机可以向代理发起一条连接,在代理的作用下,相当于直接连到内部主机。这在使用port命令的ftp软件中经常会遇到。
socks5比socks4改进之处是增加了udp association功能,内部网络用户可以通过该功能与外界主机进行udp数据包的收发。oicq中最常用的就是这一功能。

pxq 2000-09-11
  • 打赏
  • 举报
回复
关注
加载更多回复(17)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧