看了一下jabberd1.4的代码

因为google talk使用xmpp协议的原因,jabberd在国内进一步的提高了知名度。网站在http://www.jabber.org/ 。xmpp简单说就是用xml定义了一些IM消息包的格式,jabberd是其server端最早的一个实现,有两个版本一个是1.4一个是2.0,前者使用文件系统存储数据,后者可以用数据库。02年的时候,国内就有人用jabberd做服务器端。我所知道的,uume(一个没有什么名气的im软件)就是用的jabberd,anyQ也是,client用的是Exodus改的,这个是用delphi开发的。官方网站上一堆客户端,服务器端的开源项目,大家有兴趣找来看看吧。jabberd有个特点,它用服务器插件的形式,支持MSN,ICQ,yahoo,用它做服务器可以比较省事,懒是一种美德啊!这是真理。
 下午没事,翻出jabberd的代码看了一下,用c写的,习惯了OOP来看,觉得可读性太差,(向那些在unix上写程序的兄弟致敬)!代码风格不算好,1500行左右的文件有几个,虽然是99年开始的项目,对比一下同期的delphi5的vcl,和jdk,老外也不都是大牛,ACE的代码风格也很烂。写本文的时候,我临时去看了一下jabberd2的代码,好看多了,核心部分也完全重写了,要是有人想攒点东西,建议你用jabberd2。
     在源文件pool.c/lib.h中提供了一个memory manager,与其说是manager,不如说是trash
它用一个free_list指针链表,维护每块从heap分配的内存,然后集体释放,这样做是避免内存泄漏,不是gc,也没有内存池的功能。
   jabberd采用了non-blocking Socket,应此在处理网络I/O的时候,老套路了,an old story,
主线程create一个子线程,初始化一下数据之后,就开始不停的打印服务器负载信息,在这个子线程里面,bind ->listen,accept,使用select处理接受到的客户端连接。如果服务器要向外主动发起连接,每个连接对应一个新的工作线程。实际上,它使用了pth库,所以使用的select是pth_select。
   根据C10K那篇经典文章,linux下高性能IO应该epoll,kqueue也行,jabberd2放弃了pth库,直接简单的使用了select和poll。IM的server,服务器负载相对MMRPG Sevrer来说很小,就我了解的实际应用,一个jabberd server支持几千客户端问题不大。
      对客户端连接来说,100以下的,什么方便用什么,随便从indy里面拿个threadSocket就可以应付,100-2000的,数据量如果不太大,select很合适,Bittorrent就是用的这个(linux上用的是poll,windows用的select),2000-10000,linux下用epoll,windows下面可以用IOCP,更多的并发连接,就需要考虑cluster。
      网络应用编程很简单,所谓server,最重要的工作是管理各种内存块,有太多现成的东西可以用的,简单应用,可以用indy(支持delphi,bcb,.net),它都是阻塞模式的,做服务器要用多线程,但是提供了很多高层协议的控件,省事啊,服务器程序,如果不打算使用多线程,必须使用Asynchronous socket 。快速开发,推荐用python,异步socket有asyncore(zope贡献出来的),Twisted库等,当然如果很强调效率和负载,还得用c++自己攒吧。
   c#啥都能做,懒的话,就用Indy,java有一个nio包,n就是non-blocking的意思,底层应该是用select实现的。 
    网络服务器的类库,都采用异步 socket,因此架构都差不多,都是要自己实现一个类似windows消息的分发机制,ACE如此,TWisted如此,甚至NIO也如此。

你可能感兴趣的:(代码)