ChannelOption.SO_BACKLOG, 1024-> java socket参数详解:BackLog

 java socket参数详解:BackLogjava

输入链接指示(对链接的请求)的最大队列长度被设置为 backlog 参数。若是队列满时收到链接指示,则拒绝该链接。
注意: 
1. backlog参数必须是大于 0 的正值。若是传递的值等于或小于 0,则假定为默认值。 
2. 通过测试这个队列是按照FIFO(先进先出)的原则。
3. 若是将accept这个函数放在一个循环体中时,backlog参数也不会有什么做用。或者简单的讲运行ServerSocket的这个线程会阻塞时,不管是在accept,仍是在read处阻塞,这个backlog参数才生效。
建一个ServerSocket实例,绑定到端口10000,backlog设置为2apache

Java代码  收藏代码服务器

package socket;  
  
import java.io.*;  
import java.net.*;  
import org.apache.log4j.Logger;  
  
public class Test_backlog {  
    private static Logger logger = Logger.getLogger(Test_backlog.class);  
  
    public static void main(String[] args) throws Exception {  
        BufferedReader in = null;  
        PrintWriter out = null;  
        int backlog = 2;  
  
        ServerSocket serversocket = new ServerSocket(10000, backlog);  
        while (true) {  
            logger.debug("启动服务端......");  
            int i;  
            Socket socket = serversocket.accept();  
            logger.debug("有客户端连上服务端, 客户端信息以下:" + socket.getInetAddress() + " : " + socket.getPort() + ".");  
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            out = new PrintWriter(socket.getOutputStream(), true);  
            do {  
                char[] c = new char[1024];  
                i = in.read(c);  
                logger.debug("服务端收到信息: " + new String(c, 0, i));  
            } while (i == -1);  
            out.close();  
            in.close();  
            socket.close();  
            logger.debug("关闭服务端......");  
        }  
    }  
}  

服务端日志:socket

Python代码  收藏代码函数

0    [main] DEBUG socket.Test_backlog - 启动服务端......  
3871 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息以下:/127.0.0.1 : 4176.  
18888 [main] DEBUG socket.Test_backlog - 服务端收到信息: 发送完信息我就断掉。  
18888 [main] DEBUG socket.Test_backlog - 关闭服务端......  
18889 [main] DEBUG socket.Test_backlog - 启动服务端......  
18890 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息以下:/127.0.0.1 : 4177.  
45316 [main] DEBUG socket.Test_backlog - 服务端收到信息: 我是第二个客户端,发完后我也断掉。  
45316 [main] DEBUG socket.Test_backlog - 关闭服务端......  
45316 [main] DEBUG socket.Test_backlog - 启动服务端......  
45317 [main] DEBUG socket.Test_backlog - 有客户端连上服务端, 客户端信息以下:/127.0.0.1 : 4178.  
52501 [main] DEBUG socket.Test_backlog - 服务端收到信息: 最后一个拉。  
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。工具

相关文章
相关标签/搜索