
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.7 小结
除了Socket的第1个不带参数的构造方法,其他构造方法都会试图建立与服务器的连接,如果连接成功,就返回Socket对象;如果因为某些原因连接失败,就会抛出IOException。
当客户请求与服务器程序连接时,可能要等待一段时间。默认情况下,客户会一直等待下去,直到连接成功,或者出现异常。如果希望限定等待连接的时间,可通过connect(SocketAddress endpoint,int timeout)方法来设置超时时间,参数timeout表示超时时间,以ms为单位。
在通信过程中,如果发送方没有关闭Socket,就突然终止程序,接收方在接收数据时会抛出SocketException。发送方发送完数据后,应该及时关闭Socket或者关闭Socket的输出流,这样,接收方就能顺利读到输入流的末尾。
Socket有许多选项,用来控制建立连接、接收和发送数据,以及关闭Socket的行为。
·TCP_NODELAY:表示立即发送数据。
·SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址。
·SO_TIMEOUT:表示接收数据时的等待超时时间。
·SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket。
·SO_SNDBUF:表示发送数据的缓冲区的大小。
·SO_RCVBUF:表示接收数据的缓冲区的大小。
·SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。
·OOBINLINE:表示是否支持发送1字节的TCP紧急数据。