ServerSocket构造函数中backlog参数的含义,可以接受客户端的数量

标签: serversocket 构造函数 backlog | 发表时间:2014-07-23 15:56 | 作者:无量
出处:http://www.iteye.com
1.Server类
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器端
 */
public class Server {
	ServerSocket server = null;
	int serverPort = 9999;
	int backlog = 3;//ServerSocket构造函数中的backlog参数
	
	public Server() throws Exception {
		server = new ServerSocket(serverPort, backlog);
	}
	
	public static void main(String[] args) throws Exception {
		Server server = new Server();
		server.service();
//		Thread.currentThread().sleep(1000*600);//持续600秒
	}
	
	public void service() {
		int count = 1;
		while(true) {
			Socket socket = null;
			try {
				socket = server.accept();
				System.out.println("new connection has connected,num:" + count++);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

2.Client类
import java.net.Socket;
/**
 * 客户端
 */
public class Client {
	public static void main(String[] args) throws Exception {
		for(int i=0; i<30; i++){
			Socket socket = new Socket("127.0.0.1", 9999);
			System.out.println("client connection:" + (i+1));
		}
	}
}

3.程序输出结果
----当Thread.currentThread().sleep(1000*600);被注释掉时

客户端输出结果:


服务端输出结果:


----当server.service();被注释掉时

客户端输出结果:


4.结果解析
*当server.service()方法被注释后,使得服务器与9999端口绑定后,永远不会执行serverSocket.accept()方法,这意味着ServerSocket队列中的连接请求永远不会被取出。

*当Thread.currentThread().sleep(1000*600);被注释后,使得服务器与9999端口绑定后,就会在一个while循环中不断执行serverSocket.accept()方法,该方法从队列中取出连接请求,使得队列能够及时的腾出空间,以容纳新的连接请求。

*即ServerSocket构造函数中的backlog参数时,是可以serverSocket在不调用accept方法取出连接时,能接受的最大连接数


5.不同ServerSocket构造函数的区别
a.
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException;
构造一个ServerSocket服务端,指定端口是port,可以接受的最大socket客户端连接数backlog(当serverSocket不调用accept方法时),bindAddr是本机中IP中的一个
注:当机器有多个网卡是,会有多个IP,new ServerSocket时,要指定其中一个ip,如果不指定,系统会自动绑定其中一个
b.
public ServerSocket(int port, int backlog) throws IOException;
这个构造函数没有指定绑定提供服务的本机地址,其实质是调用了上面的方法
ServerSocket(port, backlog, null),当地址不提供时,系统会自动在本机多个IP中选一个当做地址,如果本机只有一个网卡即一个Ip,就绑定这个IP,一般绑定127.0.0.1
c.
public ServerSocket(int port) throws IOException;
这个方法相当于调用ServerSocket(port, 50, null),默认队列中支持50个客户端socket连接(当服务端队列中socket连接没有被移除时)


6.一个小程序:判断机器中哪些端口已经被占用
import java.io.IOException;
import java.net.ServerSocket;

public class Test1 {
    public static void main(String[] args) {  
        ServerSocket serverSocket = null;  
        for(int i = 0; i < 65535; i++) {  
            try {  
                serverSocket = new ServerSocket(i);  
                serverSocket.close();  
            } catch (IOException e) {  
                //e.printStackTrace();  
                System.out.println("端口" + i + "已经被其他服务器进程占用");  
            }  
        }  
    }  
}

输出结果:



该程序循环判断1到65535的端口有没有被占用,当被占用时会打印输出被占用的端口号

ServerSocket的几个方法

   *isClosed():判断serverSocket是否已经被关闭,只有执行了ServerSocket的close方法,isClosed()方法才返回true,否则,即使ServerSocket还没有和特定的端口绑定,isClosed方法也会返回false

   *isBound():判断ServerSocket方法是否已经与一个端口绑定,只要ServerSocket已经和一个端口绑定,即使它已经被关闭,isBound()也会返回true

    *如果需要判断一个ServerSocket已经与特定端口绑定,并且还没有被关闭,则可以采用下列方式:

        boolean isOpen = serverSocket.isBound() && !serverSocket.isClosed()


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


ITeye推荐



相关 [serversocket 构造函数 backlog] 推荐:

ServerSocket构造函数中backlog参数的含义,可以接受客户端的数量

- - Java - 编程语言 - ITeye博客
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 服务器端 */ public class Server {. int backlog = 3;//ServerSocket构造函数中的backlog参数.

Redmine Backlog tracker注意事项

- - CSDN博客研发管理推荐文章
最重要的,story和task的tracker不能相同. 否则在taskboard中会将task和story并列显示,尽管它们是父子关系. 因此比较好的做法是,story使用redmine默认的tracker:Support, Bug 和Feature. 而另外创建一些tracker用来跟踪task.

java socket参数详解:BackLog

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

Scrum之backlog估算与分解

- - ITeye博客
在Scrum中,针对PO提出的backlog进行估算与分解是Scrum master常见的工作,简单总结了下一些概念和方法:. 1.关注backlog的创建者和来源,优先级,以及发布时间. 2.对每个backlog进行成本,复杂度,风险,功能点. 3.针对backlog在计划会议上进行任务分解,把每个backlog分解为多个task,团队成员根据相应分工与特长估算工时和认领:.

Scrum 学习篇 -- Backlog之浅析 (一)

- - ITeye博客
本文所说的Backlog是Scrum中的一个专用名词,大约意思是待办的工作事项. Backlog里面放的是需要实现的所有任务,包括功能性的和非功能性的任务,换句话说,就是咱们已经把客户的需求提炼出来并且已经完成了设计的部分,现在这些已经完成设计的用户需求被放在一个地方,持续添加新的进来并且随时可以分配出去进行开发,这个地方就叫做Backlog.

[原]白话SCRUM 之三:sprint backlog

- - 麦哲思科技
Sprint Backlog就是任务列表,如果映射到传统的项目管理理论中就是WBS(work breakdown structure),而且是典型的采用面向交付物的任务分解方法得到的WBS. 比如有一个Product backlog 条目为:.     作为系统的合法用户,可以通过录入账号和密码登录到系统中.

[原]白话SCRUM 之二:product backlog

- - 麦哲思科技
        在SCRUM方法中明确要求了3个文档:           1 product backlog.         Product backlog 中列举了本项目应该实现的需求,需求采用了用户故事的方式进行描述,用户故事是一句简短的采用用户熟悉的术语表达的需求,是用户讲给开发人员的故事,不是开发人员讲给用户的故事.

Scrum 学习篇 -- Backlog之浅析 (三)

- - ITeye博客
介绍了上面三个Backlog的重要性,大家应该能感觉到在敏捷中,Backlog的确是非常重要的一个概念. 下面就来具体介绍一下Backlog的几个分类:. 由于不同的公司、不同的专家对Backlog的分类总是有点区别,所以我们就以业界最知名的敏捷开发工具 TechExcel DevSuite中的Backlog来举例子吧,.

Scrum 学习篇 -- Backlog之浅析 (二)

- - ITeye博客
 除了优先级外,还有一个设置也是非常重要的,就是对于每个任务,你需要做工作量预估,预估什么呢,预估该任务开发完成所需的时间和人力等,敏捷里把这个预估叫做Story Point,故事点. 故事点这个概念现在争议很多,究竟以怎么样的方式来预估工作量呢. (1) 有人说用小时,但是我们知道能力强的人跟能力弱的人所用的小时数必然是两样的,所以通过小时来得到故事点并且进而得到Velocity数据是不正确的.

Product Backlog排序,通向成功的顺序

- - InfoQ中文站
传统上,有些产品负责人通过对项目经济回报指标孤立地两两比较,进行backlog优先级排序. 成功的敏捷团队通常采用一种整体的方法,综合考虑backlog条目的风险、依赖关系和复杂性的相互影响.