有感于数封邮件

        真的很意外,我在Blog中公开自己研究Jabber后,会有那么多人找我。可见IM的二次开发和应用还是有一定的市场的。但是这个市场到底有多大?很值得研究,我对此持保留态度。目前的IM,不捆绑服务,是毫无价值的,不捆绑拳头级的服务还是没有价值的。想走QQ的路,慢慢自己培养市场更不太可能,大公司随时可以用资金和技术优势排挤掉任何新生的IM创意或者产品。

        回到Jabber协议本身,我真希望国内也能有个Jabber的开源社区。但是正如我前面所说,开源固然好,但有些程序员总是不自觉地要做些出轨的事情。在国外都能出DivX到XVid的事情,国内就更没办法了。这里不得不再谈下我收到的那几封邮件,其中有人是想空手套白狼的,更有甚者,上来就问我要代码。这里我就省略几千字脏话了,毫不夸张,当时看到某些人的邮件,真是想破口大骂,太不要脸了,甚至都公开说是公司搞开发。我仍然很客气的回复了邮件,告诉他们如果有问题,可以直接在EMAIL中说明,我会尽可能的解答。 然而 ,从头到尾,他们既不说自己的来历,也不说自己的问题是什么,就是一句话,要代码。大家都是混程序员这行的,没吃过猪肉也见过猪跑,不是不相信你,但也不得不有所担心,有些事情,不摊开说也明白会怎么回事。几封邮件往来后,我只能直言说不可能给源代码。最后倒落了个我不好的结果,说什么我不给就算了,代码谁都能写,大不了浪费点时间。既然如此,你早干嘛去了?再说了,Jabber开源的代码那么多,你既然都看不懂,那我给你我写的代码你不还是看不懂?如果真要讨论技术,那就必须说出你的难点,别人才能具体讲解。

        当然,在邮件中也有一些不错的技术朋友,是真心想讨论讨论。只可惜曾经的www.jabber.com.cn 现在成了个啥。我有想法从新成立jabber的中国社区,不知道同在研究Jabber的朋友们是否有兴趣?

        再说说我的封装JOPL的进度。上个月,基本封装了五个控件:TMainSession,TVCard,TSearcher,TChatController,TCallBackList。把原来那种VC风格的框架和代码都隐藏起来啦,像个Delphi写出来的东西,VCL的代码风格。二次开发者也不再需要使用什么Callback,都是标准的OnXXX事件。需要说明的是TCallbackList(其他的几个估计大家看名字就知道干啥的),他封装了Session的RegisterCallback函数,因为原来的注册函数和销毁函数需要自己维护每个被注册进去的回调的序号,用起来很麻烦。这个封装可以使用回调函数名来进行管理,这就方便多了。举个例子现在的注册方法是:
TCallbackList.RegisterCallback('SessionCallBack', SessionCallback);
于是,你注销这个函数时,只需要传入函数名即可,
TCallbackList.UnRegisterCallback('SessionCallback');
一切搞定。哈哈,不需要再自己维护一大堆回调函数的序号。

        TChatController是针对原来的ChatController所封装的,有所修改和扩展,适用并配合我自己封装的MainSession。原有的ChatController使用起来比较麻烦,非常容易出错,特别是ChatController的注销,而且它使用类似于COM的引用计数机制,这一下维护的代价还是很大的。反正在过程研究中我被JOPL的许多使用细节给搞得很头疼,而且没有文档。又比如JOPL的Disconnect,在不同的状况下断线,虽然都触发了消息 disconnected,但是不同的状况下你不见得都可以调用Disconnect方法。呵呵,刚开始没有仔细区分,吃了不少苦头。以上控件都应用到自己写的IM客户端里,开发速度异常快,根据需求进行修改也非常方便。

       然后是关于表现层的东西,我还设计了用于保存系统配置和用户个人配置的两个xsd文件,保存系统消息和聊天记录的xsd,给Delphi导入成XML接口用,规划了用户目录结构。写了一个EmotionRichEdit和EmotionCache(两者配合使用,后者为实际的Emotion数据控件负责读取配置文件和Emotion图片,类似于ADOConnection和ADOTable控件之间的关系),用于支持表情的输入和传输。还有一个LinkLabel,MenuButton,都是从TNT控件继承下来的。其中MenuButton还需要支持Caption的部分显示,就是当Caption的长度超过Button长度时,在Caption后面显示省略号。类似MSN的那个MenuButton。以上控件都要支持Unicode。

      最后一个比较麻烦的问题就是服务器,eJabberD和Wildfire在有些细节上的处理是不太一样的。比如订阅消息,在用户不做出拒绝或者接受等任何具体反馈之前,订阅消息会在用户每次登录时都发送给他。而eJabberD只发送一次。Wildfire还接受一个RosterItem同时具有两个相同的Group,不可思议。诸如此类还有不少。
posted @ 2006-08-10 01:35 monkeyking 阅读(...) 评论(...) 编辑 收藏