上一小节讲解了 ServerSocket 对象,它可以实现服务器端程序,但只实现服务器端程序还不能实现通信,此时还需要一个客户端程序与之交互,为此 JDK 提供了一个 Socket 类,用于实现 TCP 客户端程序。通过查阅 API 文档可知,Socket 类同样提供了多种构造方法。接下来就对 Socket 的常用构造方法进行详细讲解。

    • Socket()

    使用该构造方法在创建 Socket 对象时,并没有指定 IP 地址和端口号,也就意味着只创建了客户端对象,并没有去连接任何服务器。通过该构造方法创建对象后还需要调用 connect(SocketAddress endpoint)方法,才能完成与指定服务器的连接。其中,参数 endpoint 用于封装 IP 地址和端口号。

    • Socket(String hostk, int port)

    使用该构造方法在创建 Socket 对象时,会根据参数去连接在指定地址和端口上运行的服务器程序。其中,参数 host 接收的是一个字符串类型的 IP 地址。

    • Socket(InetAddress address,int port)

    该构造方法在使用上与第 2 个构造方法类似,参数 address 用于接收一个 InetAddress 类型的对象,该对象用于封装一个 IP 地址。

    在以上 Socket 的构造方法中,最常用的是第一个构造方法。了解了 Socket 的构造方法后,接下来学习一下 Socket 的常用方法,如下表所示:

    方法声明 功能描述
    int getPort() 该方法返回一个 int 类型对象,该对象是 Socket 对象与服务器端连接的端口号
    InetAddress getLocalAddress() 该方法用于获取 Socket 对象绑定的本地 IP 地址,并将 IP 地址封装成 InetAddress 类型的对象返回
    void close() 该方法用于关闭 Socket 连接,结束本次通信。在关闭 Socket 之前,应将与 Socket 相关的所有输入输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源
    InputStream getInputStream() 该方法返回一个 InputStream 类型的输入流对象,如果该对象是由服务器端的 Socket 返回的,就用于读取客户端发送的数据;反之,用于读取服务器端发送的数据
    OutputStream getOutputStream() 该方法返回一个 Outputstream 类型的输出流对象,如果该对象是由服务器端的 Socket 返回的,就用于向客户端发送数据;反之,用于向服务器端发送数据

    上表中列举了 Socket 类的常用方法,其中,getInputStream()和 getOutputStream()方法分别用于获取输入流和输出流。当客户端和服务器端建立连接后,数据是以 IO 流的形式进行交互的,从而实现通信。接下来通过一张图来描述服务器端和客户端的数据传输,如下图所示:
    image.png