通过前面的学习可知,在开发 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 对象,用于和客户端实现通信,程序才能继续向下执行。