java网络编程学习笔记,二:socket详解

1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号。当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接。默认情况下,Socket的构造方法会一直等待下去,直到连接成功或者是出现异常。Socket的构造方法请求连接的时候,受到底层网络传输速度的影响,可能长时间处于等待状态。如果希望限定等待时间,就需要一个无参的构造方法,可以如下做:

Socket socket=new Socket();

SocketAdress remoteAddr=new InetSocketAddress("localhost",800);

socket.connect(remoteAddr,60000);//等待建立连接的超时时间是1分钟,以毫秒为单位。

上面的代码代表的是socket等待连接的时间是1分钟,如果超过1分钟,就会抛出SocketTimeOutException.

2.设定服务器地址

//返回本地主机的地址

InetAddress addr1=InetAddress.getLocalHost();

//返回代表“222.34.5.7”

InetAddress addr2=InetAddress.getByName(“222.34.5.7”);

//返回域名为“www.baidu.com”的IP地址

InetAddress addr2=InetAddress.getByName(“www.baidu.com”);

3.设定客户端的地址

在一个Socket对象中,既包含远程服务器的对象和端口信息,也包含本地客户端的地址和端口信息。默认情况下,客户端的IP地址来源于客户程序所在的主机,客户端的端口则由操作系统随机分配。

4.客户端连接服务器时出现的四大异常

UnknowHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。

ConnectionException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。

SocketTimeoutException:如果连接超时,就会抛出这种异常。

除了以上4种异常外,还有一个绑定异常,

socket=new Socket();

socket.connect(remoteAddr,1000);

修改为:

socket=new Socket();

socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.7"),5678));

socket.connect();

修改后的代码试图将Socket的本地IP地址设为:222.34.5.7,将端口设置为5678.如果本机不具有IP地址222.34.5.7,或者5678端口已经被占用,那么修改后代码的bind方法就会抛出BindException。

当调用socket的close方法会释放掉socket所占用的资源。