在使用APACHE时,有个配置选项,就是APACHE程序有多少个工作线程,一般也就是20-30个,但却能为几千个用户同时提供WWW服务。而我们自己写程序时,开线程时,一般也就10个吧,但却不能同时向几千个用户同时传输文件,只能10个、10个的传,传完这10个再传下10个,依此类推。
还有就是邮件系统,包括使用POP3的,邮件服务器可同时接受多个POP3客户端的连接、收发,也远远超出10个。类似的还有FTP服务器,FTP服务器也可以同时承受几百上千个下载上传。
想问的是:这其中的区别在哪里?以上这些软件采用了什么特殊的技术吗?我如何可以同时向几百、几千个用户传文件?

解决方案 »

  1.   

    他们使用了非阻塞的socket io。而你的估计没有使用非阻塞io
      

  2.   

    非堵塞的IO也只是在连接方面没有问题,而处理发送/接收是我需要处理的,怎么使用非堵塞IO呢?
      

  3.   

    HTTP的连接非常短,传输完毕之后就断开连接了,所以很少的线程就能对很多请求做出相应
      

  4.   

    不然,使用阻塞io,意味着必须为每一个连接开启一个线程,而在网络中,往往网络速度远小于cpu的速度,阻塞使得cpu的有限资源消耗在了线程开销中,非阻塞io(NIO)使用轮询通道和选择器,使得一个线程可以处理多个连接,从而降低了线程开销。
    相比winsock的io模型(select、WSAAsyncSelect、WSAEventSelect、重叠io、完成端口),java的nio应该是最好理解的了。