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

[size=medium][color=brown][b]1.Server类[/b][/color][/size]
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();
}
}
}
}
}

[size=medium][color=brown][b]2.Client类[/b][/color][/size]
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));
}
}
}

[size=medium][color=brown][b]3.程序输出结果[/b][/color][/size]
[b][color=brown]----当Thread.currentThread().sleep(1000*600);被注释掉时[/color][/b]

[color=indigo]客户端输出结果:[/color]
[img]http://dl2.iteye.com/upload/attachment/0099/4590/221003c3-005c-3cf1-81db-2add86e35c6a.jpg[/img]

[color=indigo]服务端输出结果:[/color]
[img]http://dl2.iteye.com/upload/attachment/0099/4592/6059e986-3df6-3364-a16a-150707dd44d1.jpg[/img]

[b][color=brown]----当server.service();被注释掉时[/color][/b]

[color=indigo]客户端输出结果:[/color]
[img]http://dl2.iteye.com/upload/attachment/0099/4603/8e1869cc-988c-323a-8ea5-71f9f04d8b89.jpg[/img]

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

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

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

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

[size=medium][color=brown][b]6.一个小程序:判断机器中哪些端口已经被占用[/b][/color][/size]
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 + "已经被其他服务器进程占用");
}
}
}
}

[b][color=indigo]输出结果:[/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0099/4618/e096011e-616e-3be3-9fde-1a80b1f0786a.jpg[/img]
[color=indigo][b]
该程序循环判断1到65535的端口有没有被占用,当被占用时会打印输出被占用的端口号

ServerSocket的几个方法

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

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

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

boolean isOpen = serverSocket.isBound() && !serverSocket.isClosed()[/b][/color]
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值