`
jimmee
  • 浏览: 531015 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java NIO 异步网络构建高性能服务器(一)(原创)

    博客分类:
  • J2SE
阅读更多
1.问题
   构建高性能的服务器时,肯定要求性能越高越好,这是不言自明的道理.那么一般服务器处理客户端请求,都有哪些方式呢?
  (1) 最初级的处理方式:用一个ServerSocket进行无限循环来监听,客户端来一个连接就处理一个,后面来的连接则只能等待前面的处理好了才能进行处理,可想而知,如果每个连接处理的处理时间很长,这样的处理在一个客户要求快的响应的情况下会多么糟糕.大家都经常上网,你愿意多等那么10几秒么? 这种情况的代码形式如下:
    ServerSockt serverSocket = ....
    while (true) {
       Socket socket = serverSocket.accept();
	 // 处理socket...
    }

  所以说,很多讲网络编程的书,动不动举的例子就是上面,我真的怀疑这些人做过实际开发没有.在实际应用过程中,很少会使用这种编程开发方式的.
  (2) 稍微进步一些的:一客户端一个线程.这中处理的方式是,当来一个客户端时,就新创建一个线程进行处理.代码的方式如下:
   ServerSockt serverSocket = ....
    while (true) {
        Socket socket = serverSocket.accept();
        (new Thead() {
			public void run() {
				// 处理socket
			}
	    }) .start();
    }

  // 注意; 我上面敲的代码仅仅是表达意思,如何编写正确的方式,我想就不用多说了把.
可能刚接触这种处理方式的人会觉得,这样真好阿!每个客户端连接都用一个线程来处理,应该性能很高,响应性很好吧.如果连接数非常少的话,上面这种处理方法的确没多大问题.但是,但凡学过操作系统的人都知道,现代操作系统进程是资源分配的基本单位,而进程是调度的基本单位.要知道,调度是需要花费CPU时间的,如果线程数过多,CPU的时间都花费在调度上了,真正用于处理连接的时间则很少,当然,这仅仅是一个方面,线程的创建的会花费时间和一定的内存,这有可能会造成内存耗尽的情况并会影响响应性,而且线程的频繁切换会不能有效的利用高速缓存等等情况.因此,实际工作过程中,很少用这种“一客户端一线程”的方式.
  (3)使用线程池。上面已经一客户端一线程的情况下,线程过多时会造成的影响.自然而然的,大家就想到了使用线程池.所谓的线程池处理方法,就是预先创建好一组线程,每个线程都在监听着客户端连接,哪个先监听到连接了,就进行处理.一般代码形式如下:
ServerSocket serverSocket = ….
	for ( int i = 0; i < threadNum; i ++) {
		Thread t = new Thread() {
			public void run() {
				while (true) {
	    Socket clientSocket = serverSocket.accept();
	    // 处理clientSocket
                 }
               }
          };
         t.start();
   }
使用线程池,线程的是先预先创建的,与客户端数量无关,因此,可以控制线程的调度和相关的资源开销.Doug Lea教授为java贡献的java.util.concurrent包里提供了各种优秀的线程池的实现方式.可以直接使用,不是高手就不要乱重新发明轮子了,线程不是一般人玩的.
分享到:
评论
6 楼 it_洗净童心 2013-10-01  
谢谢博主,虽然已经是很久以前的文字了,但是看到了还是可以引发自己很多思考,而且由浅入深的来说问题就是我们正常的思考过程,这也是外文书常用的讲解方式,总之多谢博主了
5 楼 fgfd0 2010-10-11  
说一些无聊的东西,根NIO没关的东西.
4 楼 oldrat 2010-09-09  
文中没有提到包java.nio的内容,都是Block IO的内容。怎么标题有“Java NIO 异步”,是不是出错了。
3 楼 jimmee 2010-07-22  
平时都在工作,等我周末有空写后面的.
2 楼 yangguo 2010-07-14  
只是文不对题,NIO的影子都没有。(二)在哪里。
1 楼 yangguo 2010-07-14  
代码写得比较牛

相关推荐

    mina高性能Java网络框架 v2.1.3

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于Java NIO技术的TCP/...

    mina高性能Java网络框架-其他

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于Java NIO技术的TCP/...

    nio4r:适用于可扩展网络客户端和服务器的跨平台异步IO原语

    Ruby的新I / O(nio4r) :可伸缩网络客户端和服务器的跨平台异步I / O原语。 根据Java NIO API建模,但为易于使用而进行了简化。 nio4r为Ruby提供了一个抽象的,跨平台的有状态I / O选择器API。 I / O选择器是基于...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包4

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包6

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包9

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包101

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包5

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包8

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包10

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包1

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包3

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    Java资源包01

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    Netty 超高清

     无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty广泛而成功的应用,使其成为了Java高性能网络编程的卓绝框架。  Netty的现Tech...

    java开源包2

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

Global site tag (gtag.js) - Google Analytics