Socket用法详解<1>

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地址或端口绑定,就会抛出这种异常。

posted @ 2012-08-08 17:01  斗榖於菟  阅读(3377)  评论(0编辑  收藏  举报