
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.3 关闭Socket
当客户与服务器的通信结束时,应该及时关闭Socket,以释放Socket占用的包括端口在内的各种资源。Socket的close()方法负责关闭Socket。如果一个Socket对象被关闭,就不能再通过它的输入流和输出流进行I/O操作,否则会导致IOException。
为了确保关闭Socket的操作总是被执行,可以把这个操作放在finally代码块中。

Socket类提供了3个状态测试方法。
·isClosed():如果Socket没有关闭,则返回false,否则返回true。
·isConnected():如果Socket曾经连接到远程主机,不管当前是否已经关闭,都返回true。如果Socket从未连接到远程主机,就返回false。
·isBound():如果Socket已经与一个本地端口绑定,则返回true,否则返回false。
如果要判断一个Socket对象当前是否处于连接状态,可采用以下方式。

以下这段代码演示了isClosed()和isConnected()方法在各种场景中的取值。

提示
Socket和ServerSocket,以及本书后面章节介绍的 ServerSocketChannel、SocketChannel、SSLServerSocket和SSLSocket等都实现了java.lang.Auto Closable接口。这意味着如果在try代码块中打开或创建了这些类的实例,那么即使程序没有显式地关闭它们,Java虚拟机也会在退出try代码块时自动关闭它们,释放相关的资源。另一方面,尽管这些类具有自动关闭的功能,仍然建议在程序中及时显式地关闭它们,这样可以提高程序的健壮性并提高其性能。