java socket参数详解:BackLog

标签: java socket 参数 | 发表时间:2014-08-26 09:37 | 作者:stephen830
出处:http://www.iteye.com

 

 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。

 

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java socket 参数] 推荐:

java socket参数详解:BackLog

- - 开源软件 - ITeye博客
 java socket参数详解:BackLog. 输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数. 如果队列满时收到连接指示,则拒绝该连接. backlog参数必须是大于 0 的正值. 如果传递的值等于或小于 0,则假定为默认值. 经过测试这个队列是按照 FIFO(先进先出)的原则.

ZeroMQ(java)中监控Socket

- - CSDN博客架构设计推荐文章
基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情. 而且由于ZeroMQ中将连接的建立和重连接都进行了隔离,用户不需要做什么事情来维护连接,当然这样做的好处是使程序员的编码工作变少了,但是当然也有不好的地方,那就是用户失去了对ZeroMQ整个运行阶段的控制.

Java Socket常见异常处理

- - BlogJava-qileilove
java网络编程Socket通信中,通常会遇到以下异常情况:.   第1个异常是 java.net.BindException:Address already in use: JVM_Bind.   该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.

java socket 长连接read阻塞问题

- - PHP & Java
1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length. 2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效. socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException.

有关socket read

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 实际开发中,网络程序最可能遇到的就是数据没收到、收到错误数据这样诡异的问题.. 很多时候,都是由于对socket read的细节理解的不一致,导致了程序前后的矛盾. 下面详细阐述整个read的过程. read函数是负责从fd中读取内容.. 当读成功时, read返回实际所读的字节数.

Java虚拟机(JVM)参数简介

- - ITeye博客
Java虚拟机(JVM)参数简介. 在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能. JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置. 但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能. 另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误.

Java可变参数的性能分析

- - Java译站
可变长参数列表是Java 5中的一个新特性. 如果方法需要传入多个同类型参数的话,这个功能就非常有用. 比如说,Java 5之前如果要写一个方法来将所有入参打印到控制台上的话,它的代码会是这样的:. Java 5增加了对可变参数的支持. 这个方法现在看起来就简单多了(译注:这里看起来简单难道不是因为新的for循环.

Java 6 JVM参数配置说明

- - Java - 编程语言 - ITeye博客
-XX:+

java参数传递机制浅析

- - CSDN博客编程语言推荐文章
java语言中,参数的传递只有一种机制,那就是 值传递. 下面将通过几个例子来说明java中的参数传递机制,这些例子基本涵盖了所有参数传递的情况. 结果当然很显然都是10,因为基本数据类型传递的是值的一份拷贝(副本),对副本操作不影响原始值.     2.1.对参数重新赋值:. 方法中的参数只是原始对象的一份拷贝,更准确的讲是地址的一份拷贝,故而对其进行重新赋值并不会影响原始对象.

JAVA性能优化 - IBMJDKJVM参数设置

- - 编程语言 - ITeye博客
 本文将描述IBM JDK下常用参数的设置.   -Xms:最小堆大小.   -Xmx:最大堆大小.   -Xminf and -Xmaxf:GC(垃圾回收)之后可用空间的最小值最大值.   -Xmine and -Xmaxe:堆增长的最小最大值.   -Xmint and -Xmaxt:垃圾回收占时间整个运行时间的比例,默认是5%.