Socket的构造方法有以下几种重载形式:
(1) socket()
(2) Socket(InetAddress address,int port)throws UnknownHostException,IOException
(3) Socket(InetAddress address,int port,InetAddress localAddr,int localPort)throws IOException
(4) Socket(String host,int port)throws UnknownHostException,IOException
(5) Socket(String host,int port,InetAddress localAddr,int localPort)throws IOException
一、设立等待建立连接的超时时间
当客户端的Socket构造方法请求与服务器连接时,可能要等待一段时间。默认情况下,Socket构造方法会一直等下去,直到连接成功,或者出现异常。Socket构造方法请求连接时,受底层网络的传输速度的影响,可能会处于长时间的等待状态。如果希望设定等待连接的时间,该如何做呢?
此时就需要用到第一个不带参数的构造方法:
1 Socket socket=new Socket(); 2 SocketAddress remoteAddr=new InetSocketAddress("localhos",8000); 3 socket.connect(remoteAddr,60000);
以上代码用于连接到本地机器上的监听8000端口的服务程序,呆呆连接的最长时间为一分钟。如果在一分钟内连接成功,则connect()方法顺利返回;如果在一分钟内出现异常,在抛出该异常。如果在一分钟后,既没有连接成功,也没有出现其他异常,那么会抛出SocketTimeoutException。Socket类的Connect(SocketAddress endpoint,int timeout)方法负责连接服务器,参数endpoint指定服务器的地址,参数timeout设定超时时间,以毫秒为时间,吐过参数timeout设为0,表示永远不会超时。
二、设定服务器的地址
除了第一个不带参数的构造方法,其他构造方法都需要在参数中设定服务器的地址,包括服务器的IP地址或主机名,以及端口:
1 Socket(InetAddress address,int port) //第一个参数address表示主机的IP地址; 2 Socket(String host,int port) //第一个参数表示主机的名字
InetAddress类表示服务器的IP地址,InetAddress类来提供了一系列静态工厂方法,用于构造自身的实例,例如:
//返回本地主机的IP地址 InetAddress addr1=InetAddress.getLocalHost(); //返回代表"222.34.5.7"的IP地址 InetAddress addr2=InetAddress.getByName("222.34.5.7"); //返回域名为"www.cnblogs.com"的IP地址 InetAddress addr3=InetAddress.GetByName("www.cnblogs.com");
三、设定客户端的地址
在一个Socket对象中,既包括远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自客户程序所在的主机,客户端的端口则有操作系统随机分配。Socket的类还有两种构造方法允许显示的设置客户端的IP地址和端口:
1 //参数localAddress和localPort用来设置客户端的IP地址和端口。 2 Socket(InetAddress address,int port,InetAddress localAddr,int localPort)throws IOException 3 Socket(String host,int port,InetAddress localAddr,intlocalPort)throws IOException
如果一个主机同时属于两个以上的网络,他就可能拥有两个以上的IP地址。例如,一个主机在Internet网络中的IP地址为“222.67.1.34”,在一个局域网中的IP为“112.5.4.3”。假设这个主机上的,客户端程序希望和同一个局域网上的一个服务器程序通信,客户可按照如下方式构造Socket对象:
1 InetAddress remoteAddr=InetAddress.getByName("112.5.4.45") 2 InetAddress localAddr=InetAddress.getByName("112.5.4.3") 3 Socketsocket=new Socket(remoteAddr,8000,localAddr,2345)//客户端使用端口2345
四、客户连接服务器是可能跑出的异常
当Socket的构造方法请求连接服务器是,可能会抛出下面的异常。
*UnknownHostException:如果无法识别主机的名字或者IP地址,就会抛出这种异常。
*ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。
*SocketException:如果等待连接超时就会抛出这种异常。
*BindException:如果无法把Socket对象与指定的本机IP地址或端口绑定,就会抛出这种异常。