已经经过小弟的手动测试
转载(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 plaincopyprint?
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("关闭服务端......");
}
}
}
服务端日志:
[plain] view plaincopyprint?
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一些用于作标志位的一些接口
2015-10-11 13:18 907Java 中 有很多接口内容为空的 ,基本上是用来做标 ... -
企业架构
2015-10-11 13:13 742企业架构 -
场景经验
2014-12-11 13:13 595锁链的使用场景: 游戏行业最简单的例子,A玩家,B玩 ... -
JVM优化
2014-12-11 13:12 763锁消除参数(需要加上逃逸分析来对变量作用域进行 ... -
BeanUtils.copyProperties VS PropertyUtils.copyProperties
2014-11-19 20:17 626BeanUtils.copyProperties VS ... -
JVM优化
2014-09-29 20:24 0锁削除参数(必须开启逃逸分析) -XX:+D ... -
锁粗化测试
2014-07-03 20:01 846锁粗化 可以用来 ... -
java虚拟机内存模型
2014-07-03 19:30 766... -
String.intern 在java 6,7 和8中的使用- 字符串常量池
2014-05-21 17:05 8951String.intern in Java 6, 7 ... -
基本类型转String 和字符串连接机制
2014-05-21 17:03 3245Primitive types to String conv ... -
spring的autowire详解
2013-11-24 23:09 2007spring 中 autowire 经常使 ... -
项目中总结一些小经验
2013-11-13 09:18 824最近接手别人的项目中,遇到了许多坑,故作了些 ... -
镜像队列阐述(翻译)
2013-07-27 08:26 748http://activemq.apache.org/mi ... -
如何定位java.lang.NoSuchMethodError
2012-12-15 21:55 1018在运行 ... -
like 查询注意事项
2012-04-22 17:35 972http://rdc.taobao.com/team/ ... -
hibernate
2012-04-18 13:57 794在hibernate中,用hql语句查询实体类,采用l ... -
正则表达式 贪婪与堕落
2012-03-09 11:24 823String str = "start [I ... -
jvm内存管理笔记二
2012-02-29 00:12 1072选自毕玄的<<分布式java应用> ... -
jvm内存管理笔记一
2012-02-28 23:32 922节选自毕玄<<java分布式应用& ... -
解析xml乱码
2012-02-27 14:50 1824话说有一天,哥要解析XML,于是就百度COPY了一段代码 ...
相关推荐
`ServerSocket`的构造方法中的`backlog`参数可以用来设置连接请求队列的长度,覆盖操作系统的默认限制。但是,以下情况仍然遵循操作系统的限制: - `backlog`的值大于操作系统限制的最大长度。 - `backlog`的值小于...
当接收到请求后,Tomcat会解析请求头,然后根据请求的目标URL和方法(GET、POST等)来决定如何处理这个请求。如果请求指向的是一个静态资源(如HTML文件、图片等),Tomcat会直接返回该资源;如果是动态内容(如JSP...
【服务器套接字(ServerSocket)详解】 在Java编程中,`ServerSocket`类是用于创建服务器端套接字的,它是实现B/S(浏览器/服务器)架构的基础。B/S架构是一种广泛应用于互联网的客户端-服务器模型,其中浏览器作为...
2. **发送命令**:根据设备的通信协议,编写发送控制命令的代码,如开启测量、设定参数等。 3. **接收数据**:在接收到仪器返回的数据时,通过读取Socket或其他通信通道的数据流,解析并存储或显示这些数据。 4. **...
3. `ServerSocket(int port, int backlog)`:除了指定端口号外,还可以通过`backlog`参数设定等待连接队列的长度。这个参数对于处理高并发场景至关重要。 4. `ServerSocket(int port, int backlog, InetAddress ...
在Java网络编程中,`ServerSocket`类是用于创建服务器端套接字,它使得服务器能够接收客户端的连接请求。本文将深入探讨`ServerSocket`的`close()`方法及其相关知识点,包括端口释放、状态检查、信息获取,以及FTP...
Socket和ServerSocket是Java编程语言中的两个核心网络通信类,它们在实现客户端-服务器应用程序时起着关键作用。本文将深入探讨这两个类的功能、用法以及如何在实际项目中使用它们。 首先,让我们理解ServerSocket...
在Java编程语言中,`ServerSocket`类是用于创建服务器端套接字并监听客户端连接的重要工具。这个“ServerSocket的小程序”很可能是一个简单的网络聊天应用程序,由`ChatServer`和`ChatClient`两个主要部分组成。让...
socket和serversocket利用IO流编写的多线程连接相互发送消息
在上述代码中,`ServerSocket`的构造函数接收一个端口号作为参数,服务器将在这个端口上监听连接请求。`accept()`方法会阻塞,直到有客户端连接。当连接建立后,它返回一个新的`Socket`对象,代表与客户端的连接。 ...
Java网络编程的基础知识、套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务
- backlog参数定义了连接请求队列的长度。当队列满时,新到达的连接请求会被拒绝,直到服务器处理掉一些请求。 - 操作系统通常限制了队列的最大长度,例如50。通过ServerSocket的accept()方法可以取出队列中的连接...
- `ServerSocket(int port, int backlog)`: 创建一个绑定到特定端口的新`ServerSocket`,并且设置连接队列的长度(backlog)。 - `ServerSocket(int port, int backlog, InetAddress bindAddr)`: 创建一个绑定到特定...
在Android平台上,`ServerSocket`类是用于创建服务器端套接字的核心组件,它使得设备能够监听并接受来自客户端的连接请求。这个简单的Android `ServerSocket`样例展示了如何在移动设备上实现基本的网络通信功能,...
这里的`backlog`参数指定了ServerSocket的连接请求队列的最大长度,即最多能同时处理多少个等待连接的客户端请求。 4. **指定端口、队列长度和绑定地址构造方法**:`ServerSocket(int port, int backlog, ...
这个文件可能包括了创建和配置控件、设置连接参数、处理连接和断开、以及数据收发的函数和过程。 在网络编程中,Socket通信的常见应用场景包括文件传输、在线聊天、远程控制等。通过SERVERSOCKET和CLIENTSOCKET控件...
Socket和ServerSocket是Java网络编程中的核心组件,用于实现客户端和服务器之间的通信。在这个实践案例中,我们将深入探讨这两个类的使用以及如何构建一个简单的聊天应用。首先,我们需要理解Socket和ServerSocket的...