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。
相关推荐
### Socket编程函数详解 #### 一、宏定义与Socket编程 宏定义是C语言中预处理器的一个重要特性,主要用于简化代码、提高代码的可维护性和可读性。宏定义分为两种:无参数宏定义和带参数宏定义。 ##### 1. 无参数...
### Redis 3.0 配置指令详解 Redis 3.0 版本作为一款高性能的键值存储系统,在配置方面提供了丰富的选项来满足不同场景的需求。本文将深入解析 `redis.conf` 文件中的各项配置指令及其意义,并给出推荐的配置值。 ...
### Python模块详解:os、sys、time、socket等 #### os模块 `os`模块是Python的一个标准库,提供了诸多与操作系统交互的功能。通过`os`模块,开发者能够执行文件和目录的操作,如创建文件夹、删除文件、获取当前...
### Socket函数参考详解 在计算机网络编程领域,Socket编程是一项非常重要的技能。Socket是一种用于进程间通信的机制,它允许程序通过网络与另一个程序进行通信。WinSock(Windows Sockets)是微软为Windows操作...
### Socket通信相关函数详解 #### 一、Socket 函数 **功能概述:** - `socket`函数用于创建一个新的套接字。这是进行网络通信的第一步,通过调用此函数,程序能够获得一个文件描述符(通常称为套接字描述符),...
### C语言Socket编程知识点详解 #### 一、什么是Socket? Socket是一种用于进程间通信的机制,它允许不同计算机上的应用程序通过网络进行通信。在Unix和类Unix系统中,Socket被视为一种特殊的文件,可以通过文件...
### Node.js实战第二季知识点详解 #### 一、Node.js简介与特性 - **简介**:Node.js是一种基于Chrome V8引擎的JavaScript运行环境。它使用事件驱动、非阻塞I/O模型,使得轻量而高效,非常适合构建高性能、可扩展的...
### Redis常用配置项详解 #### 1. include - **解释**:此配置项用于引入其他的配置文件。例如,若存在多个Redis服务器且共享某些通用配置,可将这些通用配置集中存储在一个配置文件中(如`common.conf`),然后...
### c语言socket编程知识点 #### 1. 什么是Socket? Socket是一种用于进程间通信的机制,允许不同计算机上的应用程序相互通信。在Unix系统中,一切皆文件,Socket也不例外,它本质上是一个文件描述符,用于表示...
### Linux下Socket编程基础详解 #### 一、引言 在深入探讨Socket编程之前,我们首先需要理解什么是Socket。在计算机网络中,Socket是应用程序与网络通信之间的一个接口,它提供了一种方式来建立网络连接并进行数据...
### Socket服务端(Linux) #### 知识点概述 本文将详细介绍如何在Linux环境下构建一个简单的Socket服务端程序。此程序能够实现基本的Socket通信功能,包括创建Socket、绑定地址、监听连接请求以及处理客户端数据...
### Linux Socket编程示例知识点详解 #### 一、引言 《Linux Socket编程示例》是一本详尽介绍如何在Linux环境下使用Socket进行网络通信的书籍。本书由Warren W. Gay编写,由Que出版社出版于2000年。本书不仅提供了...
### 套接字Socket编程主要API解析 #### 一、引言 在现代网络通信领域,套接字(Socket)编程是一种重要的技术手段,它允许不同计算机之间进行数据交换。本文将详细介绍网络编程中主要使用的Socket API,这些API是网络...
在Linux系统中进行网络编程,通常涉及到的关键函数包括`socket`、`bind`、`listen`和`accept`,这些都是在TCP/IP协议栈中实现网络通信的基础。下面将对这些函数进行详细的解释和实例分析。 1. `socket`函数: `...
### Java网络编程详解 #### 一、概述 网络编程是一种技术手段,使程序能够在不同的设备(通常是计算机)之间通过网络进行交互。Java作为一种广泛应用的编程语言,在网络编程方面提供了丰富的支持。Java中的`java...
### Windows网络编程知识点详解 #### 一、课程概述与学习目标 **课程名称:** Windows网络编程 **课程目标:** - **理解Windows网络编程的基本概念。** - **掌握Win32线程编程及其同步控制机制。** - **熟悉...
- **《TCP/IP详解》**:本书深入分析了TCP/IP协议栈的工作原理,有助于深入理解Socket编程的底层机制。 - **man pages**:对于具体的函数用法和参数细节,可以参考各个函数的man页面,这是学习Unix/Linux编程不可或...
### Linux网络编程之TCP知识点详解 #### 一、TCP网络编程概述 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Linux环境下进行网络编程时,主要通过套接字...