TCP和UDP的区别
TCP在发送的时候不需要关注地址和端口。TCP是可靠的通信传输,而UDP是可靠的非链接。TCP是面向连接的,在收发数据之前,必须建立可靠的连接。
先说TCP协议:
这个协议,是面向的连接!面向连接这个概念,我们要从物理层看起。大家都知道,因为“信道复用技术”的迅猛发展,才促使了计算机网络的发展!如果没有“信道复用技术”,那么单条线路上(这里的线路指物理传输介质,例如:双绞线、光纤、电话线)单位时间内只能供一台计算机使用!
“信道复用技术”实现了,在同一条线路上,单位时间内可供X台计算机同时通信!Toad知道以下几种复用技术:
1、频分复用 2、时分复用 3、波分复用 4、码分复用 5、空分复用 6、统计复用 7、极化波复用
关于“信道复用技术”更深层次的问题,需要你自己去研究!
上面我们提到了“信道复用技术”!知道了这一点,我们就很容易明白“物理信道”上的“虚拟信道”概念了!不同的信道复用技术,使用不同的复用技术,目的就是创建“虚拟信道”。
一个TCP协议连接其实就是在物理线路上创建的一条“虚拟信道”。这条“虚拟信道”建立后,在TCP协议发出FIN包之前(两个终端都会向对方发送一个FIN包),是不会释放的。正因为这一点,TCP协议被称为面向连接的协议!
UDP协议,一样会在物理线路上创建一条“虚拟信道”,否则UDP协议无法传输数据!但是,当UDP协议传完数据后,这条“虚拟信道”就被立即注销了!因此,称UDP是不面向连接的协议!
TCP的通信特点:可靠,协议
可靠体现在什么方面?
在于它是基于连接的,必须在管道发送和接受消息。
网络通信比较重要的地方?
网络通信核心部分就是协议。
程序层面上操控的就是字节,协议操控的部分就是规则。
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
InetSocketAddress类
1,该类实现了可序列化接口,直接继承自Java.NET.SocketAddress类,类声明如下: public class InetSocketAddress extends SocketAddress。
2,构造方法:
①public InetSocketAddress(int port)创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。
有效端口值介于 0 和 65535 之间。端口号 zero 允许系统在 bind 操作中挑选暂时的端口。
参数: port - 端口号
抛出: IllegalArgumentException - 如果 port 参数超出有效端口值的指定范围。
②public InetSocketAddress(InetAddress addr, int port) 根据 IP 地址和端口号创建套接字地址。
有效端口值介于 0 和 65535 之间。端口号 zero 允许系统在 bind 操作中挑选暂时的端口。 null 地址将分配通配符 地址。
参数: addr - IP 地址 port - 端口号
抛出: IllegalArgumentException - 如果 port 参数超出有效端口值的指定范围。
③public InetSocketAddress(String hostname,int port) 根据主机名和端口号创建套接字地址。
尝试将主机名解析为 InetAddress。如果尝试失败,则将地址标记为未解析。如果存在安全管理器,则将主机名用作参数调用其 checkConnect 方法,以检查解析它的权限。这可能会导致 SecurityException 异常。有效端口值介于 0 和 65535 之间。端口号 zero 允许系统在 bind 操作中挑选暂时的端口。
参数: hostname - 主机名 port - 端口号
抛出:IllegalArgumentException - 如果 port 参数超出有效端口值的范围,或者主机名参数为 null。
SecurityException - 如果存在安全管理器,但拒绝解析主机名的权限。
3,方法详解:
①public static InetSocketAddress createUnresolved(String host, int port) 根据主机名和端口号创建未解析的套接字地址。
不会尝试将主机名解析为 InetAddress。将地址标记为未解析。 有效端口值介于 0 和 65535 之间。端口号 zero 允许系统在 bind 操作中挑选暂时的端口。
参数: hostname - 主机名 port - 端口号
抛出:IllegalArgumentException - 如果 port 参数超出有效端口值的范围,或者主机名参数为 null。
②public final int getPort() 获取端口号。
③public final InetAddress getAddress() 获取 InetAddress。如果未解析,则返回 null。
④public final String getHostName() 获取 hostname。即地址的主机名部分。
⑤public final boolean isUnresolved() 检查是否已解析地址。如果无法将主机名解析为 InetAddress,则返回 true。
⑥public String toString() 构造此 InetSocketAddress 的字符串表示形式。此 String 通过在 InetAddress 上调用 toString() 并连接端口号(使用冒号)来构造。如果未解析地址,则冒号之前的部分将仅包含主机名。 覆盖了Object的toString
⑦public final boolean equals(Object obj) 将此对象与指定对象比较。当且仅当参数不为 null,并且它表示与此对象相同的地址时,结果才为 true。
如果 InetSocketAddress 的两个实例的 InetAddress(或主机名,如果未解析的话)和端口号都相等,则它们表示同一个地址。如果两个地址都未解析,则比较主机名和端口号。 覆盖了Object的equals
⑧public final int hashCode() 返回此套接字地址的哈希码。覆盖了Object的hashCode