ServerSocket01

  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()之后后续的连接就可以顺利的执行了。

原文地址:https://www.cnblogs.com/gosaint/p/8436434.html