通过前面的学习可知,在开发 TCP 程序时,首先需要创建服务器端程序。JDK 的 java.net 包中提供了一个 ServerSocket 的类,该类的实例对象可以实现一个服务器端的程序。通过查阅 API 文档可知,ServerSocket 类通过了多种构造方法。接下来就对 ServerSocket 的构造方法进行逐一的讲解。

    • ServerSocket()

    使用该构造方法在创建 ServerSocket 对象时并没有绑定端口号,这样的对象创建的服务器端没有加内特任何端口,不能直接使用,还需要继续调用 bind(SocketAddress endpoint)方法将其绑定到指定的端口上,才可以正常使用。

    • ServerSocket(int port)

    使用该构造方法在创建 ServerSocket 对象时,可以将其绑定到一个指定的端口号上(port)。端口号可以指定为 0,此时系统就会分配一个还没有被其他网络程序使用的端口号。由于客户端需要指定的端口号来访问服务器端程序,因此端口号随机分配的情况并不常用,通常都会让服务器端程序监听一个指定的端口号。

    • ServerSocket(int port, int backlog)

    该构造方法就是在第 2 个构造方法的基础上,增加了一个 backlog 参数。该参数用于指定在服务器忙时,可以与之保持连接请求的等待客户数量,如果没有指定这个参数,默认为 50.

    • ServerSocket(int port, int backlog, InetAddress bindaddr)

    该构造方法就是在第 3 个构造方法的基础上,增加了一个 bindaddr 参数。该参数用于指定相关的 IP 地址。该构造方法的使用适用于计算机上有多块网卡和多个 IP 的情况,使用时可以明确规定 ServerSocket 在哪块网卡或者 IP 地址上等待客户的连接请求。显然,对于一般只有一块网卡的情况,就不用专门地指定了。

    在以上介绍的构造方法中,第 2 个构造方法是最常用的。了解了如果通过使用 ServerSocket 的构造方法创建对象后,接下来学习一下 ServerSocket 的常用方法,如下表所示:

    方法声明 功能描述
    Socket accept() 该方法用于等待客户端的连接,在客户端连接之前会一直处于阻塞状态,如果有客户端连接,就会返回一个与之对应的 Socket 对象
    InetAddress getInetAddress() 该方法用于返回一个 InetAddress 对象,该对象中封装了 ServerSocket 绑定的 IP 地址
    boolean isClosed() 该方法用于判断 ServerSocket 对象是否为关闭状态,如果是关闭状态则返回 true,反之则返回 false
    void bind(SocketAddress endpoint) 该方法用于将 ServerSocket 对象绑定到指定的 IP 地址和端口号,其中,参数 endpoint 封装了 IP 地址和端口号

    ServerSocket 对象负责监听某台计算机的某个端口号,在创建 ServerSocket 对象后,需要继续调用该对象的 accept()方法,接收来自客户端的请求。当执行了 accept()方法之后,服务器端程序发生阻塞,直到客户端发出连接请求时,accept()方法才会返回一个 Socket 对象,用于和客户端实现通信,程序才能继续向下执行。