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所占用的资源。