Java 客户端套接字编程全解析
1. 面向行的示例及回声协议处理
在某些示例中,程序是面向行的,它从控制台读取一行输入,将其发送到服务器,然后等待读取返回的一行输出。然而,回声协议并非如此要求,它会在接收到每个字节时立即回显,并不关心这些字节是否代表某种编码的字符,也不关心是否按行划分。
由于 Java 不允许将控制台设置为“原始”模式(即每个字符一输入就被读取,而不是等待用户按下回车键),若要探索更即时的回声响应,就需要提供非控制台接口,并且要将网络输入、用户输入和网络输出分开。这是因为连接是全双工的,但可能存在延迟。例如,在网络较慢时,用户可能在服务器返回第一个字符之前输入并发送多个字符,之后服务器可能一次性返回多个字节。与许多协议不同,回声协议不要求客户端在发送请求后等待完整的服务器响应再发送更多数据。在 Java 中处理这种协议的最简单方法是将网络输入和输出放在不同的线程中。
2. 关闭套接字
在编写客户端应用程序时,大部分工作集中在处理流和解释数据上,套接字本身使用起来很简单,许多复杂的部分都被隐藏了,这也是套接字成为网络编程流行范式的原因之一。
2.1 close() 方法
虽然套接字在其两个流之一关闭、程序结束或被垃圾回收时会自动关闭,但依赖系统自动关闭套接字是不好的做法,特别是对于可能长时间运行的程序。例如,在像网页浏览器这样的套接字密集型程序中,系统可能在垃圾回收器启动之前就达到最大打开套接字数量。示例 9 - 1 和 9 - 2 中的端口扫描程序在这方面问题尤为突出,因为程序扫描所有端口可能需要很长时间。
当使用完套接字后,应调用其 close()