首页 > 学技术 > 技术网文 > C/C++ > 正文

[精华] 我想写一个IM


来源 chinaunix.net kuqin整理

终于开始动手写自己的东西了

今天完成了第一个DEMO

功能很简单

只是实现多人之间的对话


源代码一及简单的说明在71楼
[url=http://bbs.chinaunix.net/attachment.php?aid=175514]源代码

[ 本帖最后由 net_robber 于 2007-1-2 18:34 编辑 ]



 cjaizss 回复于:2006-12-28 14:04:48

否则你觉得怎么弄?


 net_robber 回复于:2006-12-28 14:07:01

我不是那么会分析数据包,所以我向问问有没有其他办法


 cscscheng 回复于:2006-12-28 14:17:02

openq LZ可以去看看的...


 net_robber 回复于:2006-12-28 14:29:38

openq 使用的协议,已经被tencent禁止掉了

我记得半年前起就不能用了


 converse 回复于:2006-12-28 14:53:05

不是我打击楼主,我认为:
能做出这个东西的人不会在这里问这样的问题.....


 ken1984 回复于:2006-12-28 14:54:21

你可能要花上几个月专门去分析它的协议


 net_robber 回复于:2006-12-28 15:28:26

引用:原帖由 converse 于 2006-12-28 14:53 发表
不是我打击楼主,我认为:
能做出这个东西的人不会在这里问这样的问题..... 


我现在当然做不出来,这是实话

我想要做这个,主要目的是:借助这个过程,学习相关的知识

不然,每天自己只看书,不做一点实际的东西,怎么验证自己是否真正的学会了呢??

这里重点在学习的过程,请不要误解了,呵呵

以后一定会有不少需要向大家请教的,大家可要照顾我啊!

提前谢谢大家了


 book11 回复于:2006-12-28 15:52:06

linux公社有个项目,是kde下用的qq客户端,
lz可以去看看,如果lz能把它移植到gnome环境下就好了。


 net_robber 回复于:2006-12-28 16:05:48

引用:原帖由 book11 于 2006-12-28 15:52 发表
linux公社有个项目,是kde下用的qq客户端,
lz可以去看看,如果lz能把它移植到gnome环境下就好了。 




谢谢了,

只要是相关的信息,我相信,都是对我有用的


 mingyanguo 回复于:2006-12-28 16:16:00

你要仔细麻花腾要跟你打官司.


 net_robber 回复于:2006-12-28 16:41:20

????


 emacsnw 回复于:2006-12-28 16:49:40

建议不要写qq的客户端,msn或者google talk或者什么都好,呵呵。腾讯很小气的,小心被告 -_-


 assiss 回复于:2006-12-28 16:49:43

gaim2。0版已经实现了一个简单的QQ协议。
可以参考一下代码。


 cugb_cat 回复于:2006-12-28 17:09:57

如果只是练练的话,建议写个ipmsg的Linux客户端。协议是公开的。


 net_robber 回复于:2006-12-28 18:08:01

MSN和GTalk协议是公开的么??


 langue 回复于:2006-12-28 18:15:54

光明正大地做,我认为是不可能的,如果影响面大了,腾讯一定要出面干预。

所以只能自己做。抓包,分析,然后写代码,试验。

除非是在实现公开的比如 HTTP,DNS,X 这样的协议。

MSN 的协议,微软早就推出了标准。Google Talk(很多人叫它 Gtalk,我认为非标准),实际是 Jabber。


 jeffwang8001 回复于:2006-12-28 18:51:18

敬佩一下楼主先


 net_robber 回复于:2006-12-28 20:30:31

做这样一个东西,如果做下来,应该能学到不少东西

很多以前都只是理论上的东西,可以真正拿来实践一下。

就像分析数据报这种工作,几年以前,就在理论上知道了是怎么做,可是,从来没有做过

也许,现在真的有必要认真研究一下了。

就算是为了自己能够多一项技能,以后可以混得好一些


 langue 回复于:2006-12-28 20:31:52

引用:原帖由 net_robber 于 2006-12-28 20:30 发表
做这样一个东西,如果做下来,应该能学到不少东西

很多以前都只是理论上的东西,可以真正拿来实践一下。

就像分析数据报这种工作,几年以前,就在理论上知道了是怎么做,可是,从来没有做过

也许,现在真的有必要认真研究一下了。

就算是为了自己能够多一项技能,以后可以混得好一些
 



好了,说清楚这些,我认为有必要支持一下 :)


 net_robber 回复于:2006-12-28 20:33:26

其实关于要做的东西,我还是有很多设想的。

上面说的那个,只是第一步,在那个东西的基础上,还有很多工作要做。


我肯定不会只帮别人做个客户端。

我想做自己的东西。

这只是开始


 langue 回复于:2006-12-28 20:37:23

引用:原帖由 net_robber 于 2006-12-28 20:33 发表
其实关于要做的东西,我还是有很多设想的。

上面说的那个,只是第一步,在那个东西的基础上,还有很多工作要做。


我肯定不会只帮别人做个客户端。

我想做自己的东西。

这只是开始 



我觉得既然是做 IM,可以不考虑采用 Tencent/QQ 的标准 :)

可以自己来个独创。说不准,你的这个协议,会成为几年以后因特网上 IM 的又一公开标准,造福后代 :em02:

QQ 的东西,分析起来会很困难。可以模仿现成的 MSN 协议,自己订一套标准吧。


 net_robber 回复于:2006-12-28 20:53:18

我的计划是这样的:

我想甩掉诸如tencent、MSN等等这样传统的即时通讯服务器

但是第一步,我必须能够通讯。

这个软件,今天起,我已经开始写Makefile和定义、划分一些基本的功能模块了


以后有可能的话,我想在开源社区申请一个项目


当然,如果做得够大,我很有可能辞掉当前的工作


这是自从听说open source之后,我一直得梦想


 langue 回复于:2006-12-28 21:00:50

:)

开源项目的资金来源,至少有这样三种:

1、基金会。使用这种模式的项目,一般具有很高的社区声望。比如 Mozilla。
2、商业。商业化后,一些涉及知识产权的代码,不得不闭源,作为商业机密;但那是对商业用户的,对普通用户,可以在一定限制的框架中开放源代码。这样的项目,比如 matrixSSL。商业利润支持着这类项目的开发。
3、个人收入。一般这样的项目是由个人或者小群体发起的,个人在工作之余的闲暇时光,编写代码,发布。这样的项目更是多如牛毛。

我觉得就现状而言,第三种的成分会多一些。

祝 net_robber 写出一套好的即时通讯标准,及其标准实现代码 :)

目前需要做的,是初步规划,以及协议的起草。


 net_robber 回复于:2006-12-28 21:11:59

就是说,我现在不用急着做,先设计,对么??

是不是我犯了以前听说过的,软件工程中提到的,没有设计好就开始code 的错误??

我该怎么做??


我现在是一边写计划,或者说设想,大概也能叫做需求

同时写另一文档,描述程序运行起来的样子,也许可以算是以后用于测试的 测试用例

同时划分模块、定义借口。

按照功能划分文件,然后写Makefile 


现在我做 的就是这些


我没有参与过项目的设计,不知道该怎样把握。


 jeffwang8001 回复于:2006-12-28 21:13:58

看来楼主是认真的,如果需要的话,我可以贡献一份力量

但是只能是业余时间的,辞职暂时还不敢


 net_robber 回复于:2006-12-28 21:15:34

引用:原帖由 jeffwang8001 于 2006-12-28 21:13 发表
看来楼主是认真的,如果需要的话,我可以贡献一份力量

但是只能是业余时间的,辞职暂时还不敢 


吃饱了才能发展共产主义,呵呵


 langue 回复于:2006-12-28 21:21:36

引用:原帖由 net_robber 于 2006-12-28 21:11 发表
就是说,我现在不用急着做,先设计,对么??

是不是我犯了以前听说过的,软件工程中提到的,没有设计好就开始code 的错误??

我该怎么做??


我现在是一边写计划,或者说设想,大概也能叫做需求

同时写另一文档,描述程序运行起来的样子,也许可以算是以后用于测试的 测试用例

同时划分模块、定义借口。

按照功能划分文件,然后写Makefile


现在我做 的就是这些


我没有参与过项目的设计,不知道该怎样把握。
 



先规划好,后续工作就会变得轻松 :)

你可以试着把标准先制定出来,后面写代码的时候好有个参照。动手就写,不少大师都这样。如果确定自己不是大师级人物,可以慢慢来嘛。不过我不清楚你是否是大师 :em06:

参考一下诸多 RFC,看看别人是怎么写标准的 :)


 net_robber 回复于:2006-12-28 21:24:56

谢谢。有结果后,我会告诉大家的。


关于这个软件,我先设计个雏形,然后再拿来给大家提意见



最后公布一个好消息:

一个关系不做得朋友,做语音的,打算帮我设计语音部分

我运气不错,呵呵


 langue 回复于:2006-12-28 21:26:48

引用:原帖由 net_robber 于 2006-12-28 21:24 发表
谢谢。有结果后,我会告诉大家的。


关于这个软件,我先设计个雏形,然后再拿来给大家提意见



最后公布一个好消息:

一个关系不做得朋友,做语音的,打算帮我设计语音部分

我运气不错,呵呵 



不用谢。

好,祝福 :D


 puvttd 回复于:2006-12-28 21:52:48

lumaQQ就是开源的啊.

http://lumaqq.linuxsir.org/

LumaQQ 是什么?

LumaQQ 是一个独立的 Java QQ 客户端,具有可重用的纯Java核心和基于SWT的仿 QQ 界面。我们遵循GNU General Public License 许可证(简称GPL)发布。该条款的原文可见和 LumaQQ 源代码一同发布的 COPYING 文件。

需要特别声明的是 LumaQQ 是以研究和学习为目的的,我们并没有违反 QQ 的版权许可的东西。一切的协议分析都是把 QQ 当作黑箱分析,我们所做的一切都遵循中华人民共和国《计算机软件保护条例》。


 tyc611 回复于:2006-12-28 22:53:50

先崇拜一下LZ先:em15:


 nully 回复于:2006-12-28 23:14:05

目前开源qq客户端有五个:
lumaqq - java编写,吃资源大户,luma组织越来越侧重于windows端使用者
eva - c++/qt,稳定性较差
cyclone - c/gtk+,功能严重缺陷
openq - gaim插件,好像已成为历史?
gaim-qq - gaim2.0 标配,功能不完善,稳定性差

linux下的QQ客户端实际上都缺胳膊少腿,发文件,图片,个性签名这些垃圾功能没有的话也无所谓,最烦的便是稳定性问题,隔三差五崩一下,特别是好友名单多,太久没上 收到信息多的情况下,没有一个客户端能应付。
当然这与协议不开放有关。

如果有人领头开发这东西,当然要顶,不过想跟得上TX变协议的脚步,还是有困难的。


 nully 回复于:2006-12-28 23:15:30

以上纯属个人意见,勿咒。


 benjiam 回复于:2006-12-29 09:27:33

打击一下lz 有时间在这里问这个问题。 老早开始分析协议了。


我1年前就反向模拟出msn 的服务器端了。


 susesuse 回复于:2006-12-29 10:03:30

建议先考虑好通讯协议,然后考虑server端的开发,然后再是客户端,客户端的开发思路比较简单。
推荐去看看irc协议和几种主流irc server的实现。


 mezilla 回复于:2006-12-29 10:15:13

引用:原帖由 converse 于 2006-12-28 14:53 发表
不是我打击楼主,我认为:
能做出这个东西的人不会在这里问这样的问题..... 



不赞成!

送给楼主:

[size=3]
                 在你立足处深挖下去,

                 就会有泉水涌出!

                 别管蒙昧者们叫嚷:

                  “下面永远是地域!”

                             ----尼采
[/size]






 Mine 回复于:2006-12-29 11:06:24

引用:原帖由 nully 于 2006-12-28 23:14 发表
目前开源qq客户端有五个:
lumaqq - java编写,吃资源大户,luma组织越来越侧重于windows端使用者
eva - c++/qt,稳定性较差
cyclone - c/gtk+,功能严重缺陷
openq - gaim插件,好像已成为历史?
gaim-qq -  ... 




为什么要做别人的客户端呢?把时间浪费在协议分析上不可惜么?
有时间有干劲,就做个自己的东西练练。


 guotie 回复于:2006-12-29 11:27:30

不赞成重写。

不如写jabber。


 醉卧水云间 回复于:2006-12-29 11:44:38

做QQ协议极其无趣,协议控制在别人手里,做也白做。


 safedead 回复于:2006-12-29 11:50:02

严重同意

不要做QQ
建议楼主这样做

先设计通信协议
再设计客户-服务器结构
设计一个好协议, 吸引众多热爱即时通信编程的人广泛参与


 net_robber 回复于:2006-12-29 11:56:59

问一下关于协议的问题

这里只的应该是七层的协议吧???


 susesuse 回复于:2006-12-29 13:26:20

引用:原帖由 net_robber 于 2006-12-29 11:56 发表
问一下关于协议的问题

这里只的应该是七层的协议吧??? 



不是指这个。你可以看看irc协议(Internet Relay Chat Protocol),网上下载一下rfc1459看看。


 panpass 回复于:2006-12-29 13:29:52

厉害


 feasword 回复于:2006-12-29 14:21:59

支持lz
真要是做起来了,很想参与一下


 net_robber 回复于:2006-12-29 14:48:28

引用:原帖由 susesuse 于 2006-12-29 13:26 发表


不是指这个。你可以看看irc协议(Internet Relay Chat Protocol),网上下载一下rfc1459看看。 


正在看,谢谢


 baif 回复于:2006-12-29 15:42:10

EVA for KDE.


 langue 回复于:2006-12-29 15:59:12

引用:原帖由 Mine 于 2006-12-29 11:06 发表



为什么要做别人的客户端呢?把时间浪费在协议分析上不可惜么?
有时间有干劲,就做个自己的东西练练。 



:em06: 你大概误解了 nully 的意思。


 susesuse 回复于:2006-12-29 16:01:36

引用:原帖由 langue 于 2006-12-29 15:59 发表


:em06: 你大概误解了 nully 的意思。 


langue是mm?要当版主了啊,强啊:D


 gnap 回复于:2006-12-29 16:09:09

有点看不下去了。虽说如果从学习的角度,最有学习价值的,最简单的都不是做QQ客户端,但是也不要否定正在从事这些工作和想要从事这些工作的人。

LumaQQ是java写的,我不了解,不做评论。
OpenQ继承于最早开始兼容QQ协议的libqq插件,但是代码太过依赖于Gaim,熟悉它的代码还要如何为Gaim开发插件。而且代码中很多的数据结构的容器来自于glib,你还得熟悉glib的开发。

如果读EVA的代码的话,你还得了解如何开发QT程序。EVA作者功力深厚,其中libeva中对分析出来腾讯协议的数据报文的定义是最直观的,你可以直接从类继承关系中推出报文的层次。适合用来对协议本身的了解。但是EVA的网络套接字调用依赖于QT,不了解的话是个障碍。

cycloneQQ的libcyclone是依赖最少的,代码也比较短小,1万行左右,数据包的构造是使用填充的方法,适合用来了解同类软件的开发思路。

附件是我前不久checkout出来的cylconeQQ代码中的libcyclone部分。解压缩之后是一个lib文件夹。

lib-cyclone.tar.bz2


 gnap 回复于:2006-12-29 16:17:24

另外,如果真的想重写的话,建议还是重写OpenQ吧!
OpenQ现在已经并如了GAIM项目,代码不知道,功能上已经尽量符合GAIM的规范。
对比一下GAIM里面ICQ协议的oscar实现,OpenQ的代码的确非常需要重构。

建议你重构时参照oscar,不要参照MSN插件。


 xhl 回复于:2006-12-29 17:55:06

建议楼住先把QQ的网络结构弄清楚,这样对你分析网络协议十分有用。

做这种东西要把层次分的很清楚,UI, UA.....
楼主出与练习的目的,可以先用一写抓包工具分析协议,然后在首先要做一个比较稳定的QQ 协议栈,
然后在根据他的具体应用层逻辑,写UA,然后在根据自己写UI的能力,实现一个合适的UI。

这些工作往往不是一个人的力量能做的到的。没什么技术含量。。都是苦工。


 happy_number 回复于:2006-12-29 18:10:05

不是我打击楼主,我认为:
能做出这个东西的人不会在这里问这样的问题..... 
同意


 langue 回复于:2006-12-29 18:19:56

引用:原帖由 happy_number 于 2006-12-29 18:10 发表
不是我打击楼主,我认为:
能做出这个东西的人不会在这里问这样的问题..... 
同意 



别人有个人见解,跟风就不好啦。:em06:


 net_robber 回复于:2006-12-29 20:21:03

引用:原帖由 gnap 于 2006-12-29 16:09 发表
有点看不下去了。虽说如果从学习的角度,最有学习价值的,最简单的都不是做QQ客户端,但是也不要否定正在从事这些工作和想要从事这些工作的人。

LumaQQ是java写的,我不了解,不做评论。
OpenQ继承于最早开始 ... 


谢谢!


 net_robber 回复于:2006-12-29 20:27:03

我要设计的最终目标是进行点到点的通信。

我最终想做的东西不是别人的客户端。

要不要和QQ服务器通信,这个只是尽量做,因为我分析数据包的能力应该不强(至今没有做过相关的事)。
对我来说,自己设计协议,可能相对容易些。

当然,QQ还是有不少地方可以借鉴的

还有BT、电驴等P2P的软件,都很值得借鉴


 feeling00 回复于:2006-12-29 20:55:15

祝福,希望以后能用到你旗下的通讯产品:)


 james.liu 回复于:2006-12-29 21:49:00

lz做把,,我也支持你。虽然从你言语中看出你还比较稚嫩,但是相信做这个会让你有很多收获。


 benlan 回复于:2006-12-29 22:33:54

我认为LZ做不出来,到时侯做成半吊子丢了,什么都学不到(项目做一半丢了,其实是学不到什么做项目的经验的)
单纯从学习角度来说
还不如找去找个jabber 的 client(如psi等),在他基础把他做的很完美,比如做个一个类msn分格的jabber的client,如linq。现在jabber已经是开源的im标准了,如果要和qq互通,不如做个很漂亮的jabber client(个人觉得linux没有什么非常好的jabber client),然后在jabberd的serv上做个xmpp<-->qq的jabberd 插件,这样子在服务器端完成和qq的互通,也是造福所有的jabber client,这样子gtalk都可以通过xmpp,<--->qq的插件互通qq :)

[ 本帖最后由 benlan 于 2006-12-29 22:35 编辑 ]


 mjdcl 回复于:2006-12-29 22:35:13

小建议,楼主还是先熟悉下软件工程


 gnap 回复于:2006-12-29 22:50:36

事实上我也觉得做jabber收获会更多。不过LZ选择QQ自然有他自己的理由。
尤其是,程序员在学习阶段,应当尽最大的努力用技术去改善自己的环境。
因为连自己的环境都改善不了,将来怎么会有能力去改善别人的环境?

如果本着改善自己的目的出发,选择QQ是理所当然的。而且LZ用不着从零开始,现在有大量的资料和代码可以参照。在别人的基础上开发也是可行的。

支持LZ,加油吧!


 converse 回复于:2006-12-29 23:11:21

引用:原帖由 benlan 于 2006-12-29 22:33 发表
我认为LZ做不出来,到时侯做成半吊子丢了,什么都学不到(项目做一半丢了,其实是学不到什么做项目的经验的)
单纯从学习角度来说
还不如找去找个jabber 的 client(如psi等),在他基础把他做的很完美,比如做个 ... 



基本上,我之所以在前面说出打击楼主的话是基于以下的原因:
第一:楼主的功力还不够
第二:楼主定的目标太高,现在任何的第三方QQ客户端都没有完全的兼容QQ的协议,即使做出来也很难赶上QQ协议的变化。

在底子不好的时候还是先找一些现实可行的东西做吧。

要想学习抓包分析协议很简单啊,找一个已经公开协议的协议,自己抓包来看看看自己最后的分析结果是不是可以符合那个协议,等等的,其实有很多“简单且可行”的东西可以做的。

个人认为,看优秀的开源代码是提高功力的捷径,几乎赶得上看好几本好书的了。所以前面别人提出的基于别的开源代码自己定一个目标进行“二次开发”也是不错的选择。


 | 回复于:2006-12-29 23:45:45

没劲有这聊天功夫还不如找找资料复习复习再下手
别搞得udp都不知道是什么就放出话来那样只会浪费时间
说真的我也想写不过现在在学习中^_^

[ 本帖最后由 | 于 2006-12-29 23:48 编辑 ]


 gnap 回复于:2006-12-30 02:19:32

我觉得1万行的C++代码读起来很容易,又不是啥算法,网络本身也没有复杂的拓扑结构。

[ 本帖最后由 gnap 于 2006-12-30 07:15 编辑 ]


 x.jc 回复于:2006-12-30 09:45:54

有胆量,支持一下先!


 neverless 回复于:2006-12-30 19:46:18

QQ为什么不实现个其他系统的 客户端呢?


 rock_jq 回复于:2006-12-30 22:10:13

有腾讯的吗?出来说两句啊 呵呵


 Jarod 回复于:2006-12-30 23:24:39

这种认真的学习态度就让我很敬佩了,


 mingyanguo 回复于:2006-12-31 08:54:47

引用:原帖由 neverless 于 2006-12-30 19:46 发表
QQ为什么不实现个其他系统的 客户端呢? 


你应该问藤旬为什么要状告给其他系统写客户端的人。


 net_robber 回复于:2007-01-02 17:17:39

今天,第一个Demo制作完毕。

软件环境:
Window XP
MinGW-3.1.0-1
MSYS-1.0.10

编译:
make release

使用:

-add X.X.X.X 或 -add host       添加通话用户
-list                                        列出当前已连接用户(socket号)
-sendto   ****                       使用某socket通信(此处参数为上面列出的socket号)
-del   *******                        终止某socket通信(此处参数为上面列出的socket号)
-who                                      察看当前正在通信的socket号


 net_robber 回复于:2007-01-02 17:18:20

刚才忘了上传源代码了

这里补上:

LanTalk2007010202.tar.gz


 benjiam 回复于:2007-01-04 14:29:19

。。。。

看了代码。新手代码。

路还很长。 

你慢慢努力吧。


 net_robber 回复于:2007-01-04 14:58:45

是要努力,差的多呢!!!

路漫漫其修远兮!!

可惜不做相关的工作,进步的很慢!!

找一个自己喜欢的工作真难!!!!!


 gonghai78 回复于:2007-01-05 15:49:47

加油!!继续完善!!


 cscscheng 回复于:2007-01-09 14:38:04

??LZ写的是QQ客户端???感觉不象哦...
openq至少正常的发送消息现在还是可以的啊...不过群协议.还有图片.自定义表情.等功能不支持.(听说群有补丁)


 fydream 回复于:2007-01-10 17:41:04

win代码?


 net_robber 回复于:2007-01-10 18:57:56

是的,手上当前没有Linux可以用


 bitmilong 回复于:2007-01-10 20:34:20

简单看了下,感觉确实有点初级,但毕竟是已经上路了,比那些写专业代码天天只嚎叫不动手的人已经领先了很多

支持下LZ,并深切地建议能继续下去,"星星之火,可以燎原"

当年盖次兄也是从这里起步的,坚持下去就会有新的发现

当你程序大一些的时候回过头来看看现在的成果,也许,你会重写,但收获将是你在别处无法得到的

Soff的珊瑚虫最初也是抱着一种想法开始玩的

使劲写吧,趁现在年轻,有时间...


 瞬间思路 回复于:2007-06-06 17:56:46

不知道这个项目现在进展如何了?


 net_robber 回复于:2007-06-06 22:13:58

在做其他相关的东西,呵呵,称不上项目,顶多是个demo


 wuxiangzhi 回复于:2007-06-06 22:17:49

呵呵,加油。毕业设计就做了这个。vc++, c, oracle做的。糊弄老师用的。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=877683
转载请注明作者名及原文出处



收藏本页到: