一、获取Socket的信息
在一个Socket 对象中同时包含了远程服务器的IP 地址和端口信息, 以及客户本地的IP地址和端口信息. 此外, 从Socket 对象中还可以获得输出流和输入流, 分别用于向服务器发送数据, 以及接收从服务器端发来的数据.
以下方法用于获取Socket的有关信息
getInetAddress(): 获得远程服务器的IP地址.
getPort(): 获得远程服务器的端口.
getLocalAddress(): 获得客户本地的IP 地址.
getLocalPort(): 获得客户本地的端口.
getInputStream(): 获得输入流.
如果Socket 还没有连接, 或者已经关闭, 或者已经通过
shutdownInput()方法关闭输入流, 那么此方法会抛出IOException. getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.
在HTTPClient 类中, 先创建了一个连接到该HTTP服务的Socket对象, 然后发送符合HTTP 协议的请求, 接着接收从HTTP 服务器上发回的响应结果.
二、关闭Socket
当客户与服务器的通信结束, 应该及时关闭Socket , 以释放Socket 占用的包括端口内的各种资源.
Socket 的 close() 方法负责关闭Socket. 当一Socket对象被关闭, 就不能再通过它的输入流和输出流进行I/O操作, 否则会导致IOException.
为了确保关闭Socket 的操作总是被执行, 强烈建议把这个操作放在finally 代码块中:
Socket socket = null; try{
socket = new Socket(www.javathinker.org,80); //执行接收和发送数据的操作 ..........
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(socket != null) socket.close();
}
catch(IOException e){e.printStackTrace();
}
}
Socket 类提供了3 个状态测试方法.
isClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false .
isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .
isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .
如果要判断一个Socket 对象当前是否处于连接状态, 可采用以下方式:
boolean isConnected = socket.isConnected() && !socket.isClosed();
三、设置Socket 的选项
Socket 有以下几个选项.
TCP_NODELAY: 表示立即发送数据.
SO_RESUSEADDR: 表示是否允许重用Socket 所绑定的本地地址.
SO_TIMEOUT: 表示接收数据时的等待超时数据.
SO_LINGER: 表示当执行Socket 的 close()方法时, 是否立即关闭底层的Socket.
SO_SNFBUF: 表示发送数据的缓冲区的大小.
SO_RCVBUF: 表示接收数据的缓冲区的大小.
SO_KEEPALIVE: 表示对于长时间处于空闲状态的Socket , 是否要自动把它关闭.
OOBINLINE: 表示是否支持发送一个字节的TCP 紧急数据.
网友评论