Socket详解
| Socket() |
| Socket(InetAddress address, int port) |
| Socket(InetAddress host, int port, boolean stream) |
| Socket(InetAddress address, int port, InetAddress localAddr, int localPort) |
| Socket(Proxy proxy) |
protected | Socket(SocketImpl impl) |
| |
| Socket(String host, int port, boolean stream) |
| Socket(String host, int port, InetAddress localAddr, int localPort) |
. accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
. getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注重:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕捉,因为它们返回的流对象,通常都会被另一个流对象使用。
1. 设定等待建立连接的超时时间
客户端请求与服务端的Socket连接时,默认是一直等待下去,直到连接成功或者抛出异常。
以下代码用于连接本地的监听8000端口的服务端,并且设定了等待连接的超时时间,如果在1分钟内出现某种异常,则抛出该异常,如果超过了一分钟,没连接成功,也没出现任何异常,则抛出SocketTimoutException,如果在1分钟内顺利连接,则connect() 方法顺利返回
Socket socket = new Socket();
SocketAddress remoteAddr = new InetSocketAddress(“localhost”,8000);
Socket.connect(remoteAddr,6000);
4.客户端连接服务端可能抛出的异常
UnkonwnHostException:如果无法识别主机的名字或IP地址
ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接
SocketTimeoutException:如果等待连接超时
BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定
5.获取Socket的信息
在一个socket对象中包含了远程服务器的IP地址和端口信息,以及客户本地的IP地址和端口信息。从socket对象中还可以获得输出流和输入流,分别用于向服务器发送数据,以及接收从服务器发来的数据。
getInetAdress(); 获得远程服务器IP地址
getPort();获得远程服务器的端口
getLocalAddress();获得客户本地的IP地址
getLocalPort();获得客户本地的端口
getInputStream();获得输入流,会抛出IOException
getOutputStream();获得输入流,会抛出IOException
6.关闭Socket
为确保关闭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();[番茄花园1]
}catch(IOException e){ e.printStackTrace();
}
}
判断一个socket对象是否处于连接状态:
Boolean isConnected=socket.isConnected()&&!socket.isClosed();