java socket参数详解:BackLog
输入连接指示(对连接的请求)的最大队列长度被设置为 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。
相关推荐
# .github/workflows/backlog-pr-link.yml name : ' Link PR to Backlog ' on : pull_request : types : [opened, edited] jobs : backlog-pr-link : runs-on : ubuntu-latest steps : - uses : toshimaru/...
.option(ChannelOption.SO_BACKLOG, 1024) // 两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文 .childOption(ChannelOption.SO_KEEPALIVE, true); //绑定端口,开始接收进来的连接 完整代码,下载有...
* 参数: 用于监听的socket描述符指针 lsnfd * * 返回值: NULL * * 作者: 胡士超 * * 完成日期: 2012.08.09 * * ***********************************************/ void * ptr_accept(void * lsnfd) {...
敏捷管理excel模板,故事板 user story,冲刺 sprint,产品backlog,燃尽图 burndown chart
greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点。本项目受到gevent, openresty, alilua, skynet, clowwindy/ssloop的启发,在此...
支持linux百万级并发的参数, To support over 500k users, you *need* - A 64 bits hardware/kernel (AMD64, Opterons) - At least 8GB of ram - A recent linux kernel (2.6.x) About tuning, I prefer to not ...
属性node['sysctl'] - 定义内核参数的命名空间 :sysctl => { :net => { :ipv4 => { :tcp_tw_recycle => 1, :tcp_max_syn_backlog => 2000 } }}如果要避免深度散列,也可以使用字符串。 :sysctl => { ...
BacklogApiClient backlog-api-client 是一个库,可以轻松使用用于 Ruby 的 Backlog( ) Restful API(V2)。 官方文件安装将此行添加到应用程序的 Gemfile 中: gem 'backlog-api-client' 然后执行: $ bundle或者自己...
#include<sys/socket.h> #include<sys/wait.h> #define MYPORT 3490 //设定端口为3490 #define BACKLOG 10 main() { int sockfd,new_fd; struct sockaddr_in my_addr; //服务器网络地址结构体 struct sockaddr_in...
对于sk->sk_backlog_rcv的初始化。 ------> int sock_map_fd(struct socket *sock) 将文件节点与套接字联系起来 1.395 struct file *newfile; 396 int fd = sock_alloc_fd(&newfile;); 399 int err = ...
Jira-Agile-Backlog-Dependency-Checker更多信息... 截屏
hubot-backlog-assign 将积压问题分配给审阅者的 Hubot 脚本安装 $ npm install https://github.com/bouzuya/hubot-backlog-assign/archive/master.tar.gz或者 $ npm install ...assign/archive/{VERSION}.tar.gz例子 ...
t_七个小矮人_4_backlog_initial1
tcp协议三次握手,socket连接的参数详细协商过程,主要是对监听过程的分析
最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件...
它接受两个参数:`fd` 和 backlog。`fd` 是文件描述符,代表一个打开的 socket;`backlog` 是一个整数,它制定了 socket 可以排队的最大连接数。 函数定义中的变量: - struct socket *sock;: 定义了一个 socket ...
Epilog是一个用于windows系统的日志搜集传输程序,通过配置选项设置,可以实时的将监控的日志信息传送到Backlog日志服务器!
Leangoo领歌除了是敏捷开发工具之外,也提供专业的敏捷培训、敏捷认证以及敏捷咨询的服务,权威课程包括:官方权威Scrum认证培训课程(CSM,CSPO,CSD,A-CSM等)、大规模敏捷SAFe及LeSS认证培训,以及量身定制的...
backlog4j.zip,backlog4j是用于java的backlog绑定库,用于backlog api版本2的java库
用于生成codeMetadata.json,README.md,GETTING-STARTED.md,CONTRIBUTING.md,BACKLOG.md和CHANGELOG.md的单页应用程序。 codeMetadata.json文件包含有关代码资产的基本数据,例如其名称,办公室,托管实例等。 ...