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

注意:

1. backlog参数必须是大于 0 的正值。如果传递的值等于或小于 0,则假定为默认值。

2. 经过测试这个队列是按照FIFO(先进先出)的原则。

3. 如果将accept这个函数放在一个循环体中时,backlog参数也不会有什么作用。或者简单的讲运行ServerSocket的这个线程会阻塞时,无论是在accept,还是在read处阻塞,这个backlog参数才生效。

建一个ServerSocket实例,绑定到端口10000,backlog设置为2

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("关闭服务端......");

}

}

}

服务端日志:

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。

java backlog满_java socket参数详解:BackLog相关推荐

  1. Java线程池七个参数详解

    java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释. 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize.maximumPoolS ...

  2. Java Socket 参数详解

    Java socket参数选项: TCP_NODELAY:  表示立即发送数据 SO_RESUSEADDR:  表示是否允许重用socket所绑定的本地地址 SO_TIMEOUT :  表示接收数据时 ...

  3. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  4. java enum 变量_java枚举使用详解

    package com.ljq.test; /** * 枚举用法详解 * * @author jiqinlin * */ public class TestEnum { /** * 普通枚举 * * ...

  5. java异常体系_JAVA异常体系结构详解

    一.什么是异常 异常:程序在运行过程中发生由于硬件设备问题.软件设计错误等导致的程序异常事件.(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象.      --百 ...

  6. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  7. java linkedlist 节点_JAVA学习-LinkedList详解

    1.定义 实现List接口与Deque接口双向链表,实现了列表的所有操作,并且允许包括null值的所有元素,对于LinkedList定义我产生了如下疑问: 1.Deque接口是什么,定义了一个怎样的规 ...

  8. java abstract 变量_Java基础知识详解:abstract修饰符

    abstract详解 abstract一般用来修饰类和方法. 1.abstract修饰类 abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类 ...

  9. java server 参数_java serversocket参数详解

    标签: ServerSocket有以下3个选项. SO_TIMEOUT:表示等待客户连接的超时时间. SO_REUSEADDR:表示是否允许重用服务器所绑定的地址. SO_RCVBUF:表示接收数据的 ...

最新文章

  1. 实现BX的内容加上123 并把和送到寄存器AX
  2. 301缓存重定向?301 Moved Permanently (from disk cache)
  3. [Winform]只允许运行一个exe,如果已运行则将窗口置前
  4. 搭建 | 一步成功搭建Centos + Kubernetes 环境
  5. 解决centos7 wget 报错nown. wget: unable to resolve host address ‘mirrors.aliyun.com’
  6. 使用 Chrome 浏览器截取网页长图
  7. android recovery 3e,【记录】尝试用ODIN去恢复启动界面是Android system recovery 3e的I9100G...
  8. 门禁上的push是什么意思_门禁系统专业术语对照表
  9. 面试时我们应该问面试官什么问题?
  10. PhpStorm Unhandled exceptions错误解决
  11. Android 仿微信语音聊天,flutter项目结构
  12. three.js重新计算UV
  13. MATLAB信号处理——信号与系统的分析基础(1)
  14. 【计算机体系结构】非线性流水线调度算法 C++ Python
  15. ul li 自定义图标 和 图标大小
  16. 〖产品思维训练白宝书 - 产品思维认知篇⑤〗- 学习 [产品思维] 需要做哪些准备?
  17. 给定一个接口,测试人员应该如何测试?
  18. 伯克利『全栈深度学习』2022最新课程;谷歌『基于Transformers的通用超参数优化』经验分享;动图编辑器;前沿论文 | ShowMeAI资讯日报
  19. Android view 部分 setContentView 的前因后果
  20. 致所有初学者--助力所有ERP初学者!!!

热门文章

  1. [ATF]-MTK:一篇文章了解ATF原理
  2. [ARM异常]-图解armv7/armv8的异常向量表和基地址
  3. angr学习笔记(13)(static_binary)
  4. reverse-for-the-holy-grail-350逆向寒假生涯(23/100)
  5. 2020-11-23(“花式扫雷” 辅助制作)
  6. 【程序员比赛】CISCN 2021 ezj4va与Fix思路
  7. 160个Crackme031之一元二次方程
  8. Linux系统运行级别
  9. SQL语言之执行计划(Oracle)
  10. JVM堆新生代分配比例