java socket参数详解:BackLog

原文链接:http://blog.csdn.net/huang_xw/article/details/7338487


输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接。

注意: 
1. backlog参数必须是大于 0 的正值。如果传递的值等于或小于 0,则假定为默认值。 
2. 经过测试这个队列是按照FIFO(先进先出)的原则。
3. 如果将accept这个函数放在一个循环体中时,backlog参数也不会有什么作用。或者简单的讲运行ServerSocket的这个线程会阻塞时,无论是在accept,还是在read处阻塞,这个backlog参数才生效。
建一个ServerSocket实例,绑定到端口10000,backlog设置为2

[java]  view plain copy print ?
  1. package socket;  
  2.   
  3. import java.io.*;  
  4. import java.net.*;  
  5. import org.apache.log4j.Logger;  
  6.   
  7. public class Test_backlog {  
  8.     private static Logger logger = Logger.getLogger(Test_backlog.class);  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         BufferedReader in = null;  
  12.         PrintWriter out = null;  
  13.         int backlog = 2;  
  14.   
  15.         ServerSocket serversocket = new ServerSocket(10000, backlog);  
  16.         while (true) {  
  17.             logger.debug("启动服务端......");  
  18.             int i;  
  19.             Socket socket = serversocket.accept();  
  20.             logger.debug("有客户端连上服务端, 客户端信息如下:" + socket.getInetAddress() + " : " + socket.getPort() + ".");  
  21.             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  22.             out = new PrintWriter(socket.getOutputStream(), true);  
  23.             do {  
  24.                 char[] c = new char[1024];  
  25.                 i = in.read(c);  
  26.                 logger.debug("服务端收到信息: " + new String(c, 0, i));  
  27.             } while (i == -1);  
  28.             out.close();  
  29.             in.close();  
  30.             socket.close();  
  31.             logger.debug("关闭服务端......");  
  32.         }  
  33.     }  
  34. }  

服务端日志:

[plain]  view plain copy print ?
  1. 0    [main] DEBUG socket.Test_backlog - 启动服务端......  
  2. 3871 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息如下:/127.0.0.1 : 4176.  
  3. 18888 [main] DEBUG socket.Test_backlog - 服务端收到信息: 发送完信息我就断掉。  
  4. 18888 [main] DEBUG socket.Test_backlog - 关闭服务端......  
  5. 18889 [main] DEBUG socket.Test_backlog - 启动服务端......  
  6. 18890 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息如下:/127.0.0.1 : 4177.  
  7. 45316 [main] DEBUG socket.Test_backlog - 服务端收到信息: 我是第二个客户端,发完后我也断掉。  
  8. 45316 [main] DEBUG socket.Test_backlog - 关闭服务端......  
  9. 45316 [main] DEBUG socket.Test_backlog - 启动服务端......  
  10. 45317 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息如下:/127.0.0.1 : 4178.  
  11. 52501 [main] DEBUG socket.Test_backlog - 服务端收到信息: 最后一个拉。  
  12. 52501 [main] DEBUG socket.Test_backlog - 关闭服务端......  
使用TCP工具连接这个服务端

1. 当第一个客户端连接时,服务端打出如下信息:
6629 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息如下:/127.0.0.1 : 4110.
2. 当第二个客户端连接时,服务端没有打出任何东东。因为这时客户端如果虽然显示成功了,但是被阻在连接队列中。
3. 当第三个客户端连接时,情况与2相同。
4. 当第四个客户端连接时,连接不上并报错。因为backlog参数设置成2,队列中只有阻塞两个。
总结:
管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进先出的队列中。许多操作系统限定了队列的最大长度,一般为50。当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通过ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入新的连接请求。

对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户与服务器的连接建立成功,客户进程从Socket构造方法中正常返回。如果客户进程发出的连接请求被服务器拒绝,Socket构造方法就会抛出ConnectionException。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值