看了一下jabberd1.4的代码
2005-10-15 00:54
204 查看
因为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也如此。
下午没事,翻出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也如此。
相关文章推荐
- 测试一下论坛代码格式
- 有没有大神能够逐行解释一下代码?Delphi
- 测试一下动态棋谱 这个垃圾CSDN博客, 编辑的时候显示正常, 发表之后只有代码, 妈的
- 发现在系统中有好多写得很好的代码,也不知道是哪位前辈留下来的.整理一下...
- tabhost先简单记一下,以后再改(即使一样的,还是自己写的代码比较亲)
- CLR_via_C#.3rd 翻译[1.4执行程序集代码]
- 分享一下程序员必知编写代码规范
- 公布一下工资管理系统中核心部分工资计算的代码
- J2EE 1.4 Tutorial(有时候当工具书翻一下)
- 我只是个写代码的(幽默一下)
- 总结一下进程的新建和终止的操作过程。代码如下:
- 尝试一下用MARKDOWN嵌入代码
- Mark一下读入一行的代码
- 测试一下 WebSphere 6.x 对JSTL1.1的支持情况的代码
- 总结一下切换git地址 重合代码的过程
- 十几年过去了,再回顾过去的代码岁月很有感触.给大家展示一下我当初开始学VC++时,创作的启蒙作品,呵呵
- 简单代码,测试一下json.dump and json.loads
- Mark一下, dp状态转移方程写对,可是写代码都错,poj 1651 poj 1179
- SQL数据库问题 解释一下下面的代码 sql 存储过程学习
- [CLR via C#]1.4 执行程序集的代码