ServerSocket表示服务端套接字;我们首先来看下其中的一个构造器:
public ServerSocket(int port,int backlog) throws IOException
其中port表示的就是要绑定的端口号;backlog表示服务端所连接的最大长度;客户端要连接服务端,那么所有的客户端会形成一个先进先出的队列,而这个队列的最大长度是由服务端来决定的,backlog就表示这个长度;值得注意的是这个最大长度和操作系统还有关系,如果超过了操作系统限制的最大长度,那么依然是操作系所默认的最大长度。假设我们存在100个客户端,1个服务端,那我们设置请求的最大长度就是3.来看看如下所示的代码,首先创建客户端:
package com.asiaInfo.caozg.zh_02; import java.net.Socket; /** * @Authgor: gosaint * @Description: * @Date Created in 11:26 2018/2/7 * @Modified By: * 客户端数据 */ public class Client_02 { public static void main(String[] args) throws Exception{ final int length=100;//设置socket的数量 final String host="localhost"; final int port=8000; //客户端socket(localhost以及8000端口是连接的服务器) Socket[] sockets=new Socket[length]; for(int i=0;i<100;i++){ //建立100次的连接 sockets[i]=new Socket(host,port); System.out.println("第"+(i+1)+"次连接成功"); } Thread.sleep(3000); for(int i=0;i<100;i++){ sockets[i].close(); } } }
接着我们编码服务端:
package com.asiaInfo.caozg.zh_02; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * @Authgor: gosaint * @Description: * @Date Created in 11:37 2018/2/7 * @Modified By: * 服务端程序 */ public class Server_02 { private ServerSocket serverSocket; private int port=8000; public Server_02() throws IOException{ //在这里服务端设置最大的连接数为3 serverSocket=new ServerSocket(port,3); System.out.println("服务器启动"); } public void service() throws IOException { Socket socket=null; while(true){ //从连接队列中取出一个连接socket socket=serverSocket.accept(); System.out.println("1个新的连接对象"+socket.getInetAddress()+":"+socket.getPort()); if(socket!=null){ socket.close(); } } } public static void main(String[] args) throws IOException, InterruptedException { Server_02 server_02=new Server_02(); Thread.sleep(6000*10);//睡眠10分钟 server_02.service(); } }
我们可以看到服务端启动的时候使用方法accept()从请求队列中取出一个socket,建立连接执行程序;初始化的时候服务端启动,但是因为最大连接数为3,我们还没有调用service()方法,因此队列已经满了,后续的连接不能进行。因此结果如下:
第1次连接成功
第2次连接成功
第3次连接成功
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
当取消Thread.sleep()之后后续的连接就可以顺利的执行了。