TCP学习(二)

2018-03-25  本文已影响0人  W_Nicotine

Socket:

在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据.

构造Socket

Socket的构造方法有以下几种重载形式:
Socket()

Socket(InetAddress address, int port) throws UnknowHostException, IOException  
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException  
Socket(String host, int port) throws UnknowHostException, IOException   
Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException 

除了第一个不带参数的构造方法以外, 其他构造方法都会试图建立与服务器的连接, 如果连接成功, 就返回 Socket对象; 如果因为某些原因连接失败, 就会抛出IOException .

1. 使用无参数构造方法, 设定等待建立连接的超时时间
Socket socket = new Socket(); 
SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);  
socket.connect(remoteAddr, 60000);  //等待建立连接的超时时间为1分钟

以上代码用于连接到本地机器上的监听8000端口的服务器程序, 等待连接的最长时间为1分钟. 如果在1分钟内连接成功则connet()方法顺利返回; 如果在1分钟内出现某种异常, 则抛出该异常; 如果超过1分钟后, 即没有连接成功, 也没有出现其他异常, 那么会抛出 SocketTimeoutException. Socket 类的 connect(SocketAddress endpoint, int timeout) 方法负责连接服务器, 参数endpoint 指定服务器的地址, 参数timeout 设定超时数据, 以毫秒为单位. 如果参数timeout 设为0, 表示永远不会超时, 默认是不会超时的.

2. 设定服务器的地址 除了第一个不带参数的构造方法, 其他构造方法都需要在参数中设定服务器的地址, 包括服务器的IP地址或主机名, 以及端口:
Socket(InetAddress address, int port) //第一个参数address 表示主机的IP地址
Socket(String host, int port)  //第一个参数host 表示主机的名字         

InetAddress 类表示服务器的IP地址, InetAddress 类提供了一系列静态工厂方法, 用于构造自身的实例, 例如:

//返回本地主机的IP地址    
InetAddress addr1 = InetAddress.getLocalHost();  
//返回代表 "222.34.5.7"的 IP地址    
InetAddress addr2 = InetAddress.getByName("222.34.5.7");   
//返回域名为"www.javathinker.org"的 IP地址    
InetAddress addr3 = InetAddress.getByName("www.javathinker.org");
3. 设定客户端的地址

在一个Socket 对象中, 即包含远程服务器的IP 地址和端口信息, 也包含本地客户端的IP 地址和端口信息. 默认情况下, 客户端的IP 地址来自于客户程序所在的主机, 客户端的端口则由操作系统随机分配. Socket类还有两个构造方法允许显式地设置客户端的IP 地址和端口: //参数localAddr 和 localPort 用来设置客户端的IP地址和端口

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException 

如果一个主机同时属于两个以上的网络, 它就可能拥有两个以上的IP 地址. 例如, 一个主机在Internet 网络中的IP 地址为 "222.67.1.34", 在一个局域网中的IP 地址为 "112.5.4.3". 假定这个主机上的客户程序希望和同一个局域网的一个服务器程序(地址为:"112.5.4.45: 8000")通信, 客户端可按照如下方式构造Socket 对象:

InetAddress remoteAddr1 = InetAddress.getByName("112.5.4.45");
InetAddress localAddr1 = InetAddress.getByName("112.5.4.3"); 
Socket socket1 = new Socket(remoteAddr1, 8000, localAddr1, 2345); //客户端使用端口2345 
4. 客户连接服务器时可能抛出的异常当Socket 的构造方法请求连接服务器时, 可能会抛出下面的异常.

UnKnownHostException: 如果无法识别主机的名字或IP 地址, 就会抛出这种异常.
ConnectException: 如果没有服务器进程监听指定的端口, 或者服务器进程拒绝连接, 就会抛出这种异常. SocketTimeoutException: 如果等待连接超时, 就会抛出这种异常.
BindException: 如果无法把Socket 对象与指定的本地IP 地址或端口绑定, 就会抛出这种异常.
以上4中异常都是IOException的直接或间接子类.

上一篇下一篇

猜你喜欢

热点阅读