网络编程--2
网络传输三要素在Java中的体现
TCP和UDP概念
Socket基本概念
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 网络传输三要素在Java中的体现
网络通讯的三要素:IP地址、端口号和传输协议
1). InetAddress类 ----IP地址在Java中的体现
(1). InetAddress类概述
[1]. InetAddress类所在的位置
InetAddress位于java.net包中
[3]. InetAddress类的直接父类
InetAddress类的直接父类就是java.lang.Object类
[4]. InetAddress类的含义
InetAddress类表示的是对网络通讯的IP地址的封装
[5]. InetAddress类继承体系结构
{1}. Inet4Address类是对IPv4地址的封装
{2}. Inet6Address类是对IPv6地址的封装
(4). InetAddress类的构造方法
[1]. InetAddress类的实例不能用new去实例化。
[2]. InetAddress类中有关构造方法的源码
public class InetAddress implements java.io.Serializable {
//...
InetAddress() {}
//...
}
{1}. 这个构造方法是默认访问修饰符,这样非同一个包下的类就没有办法访问InetAddress这个类的构造方法。
那么InetAddress这个空参构造方法的用处是什么?---API给出的答案
{2}. 这个空参构造方法是为Socket类对象的accept方法所使用。这个空参构造方法会产生一个空的InetAddress()对象。这个对象会被accept()方法进行初始化。
【注意】这个由这个空参构造创建的InetAddress对象是不能被放入缓存的,因为这个对象没有IP地址名。
【注意】外部想获取InetAddress对象可以用过InetAddress类的静态方法getHostAddress()和静态方法getByName()方法获取InetAddress对象
2). InetAddress常用方法
(1). 获取本机InetAddress对象
[1]. 方法原型
public static InetAddressgetLocalHost() throws UnknownHostException;
[2]. 返回值类型: InetAddress类型
(2). 通过字符串形式获取指定Host的InetAddress对象
[1]. 方法原型
public String getHostName();
[2]. 输入参数
String name:这个字符串可以是主机名,也可以是字符串形式的IP地址
e.g. 字符串可以是表示主机名的“java.sun.com”,也可以是表示IP的地址的字符串“127.0.0.1”
[3]. 返回值类型:InetAddress类型
(3). 通过字符串形式获取指定Host的InetAddress数组
【注意】一台主机未必对应一个IP,比如大公司的主机对应很多IP地址。
[1]. 方法原型
public static InetAddress[]getAllByName(String host);
[2]. 输入参数
String name:这个字符串可以是主机名,也可以是字符串形式的IP地址
[3]. 返回值类型:InetAddress[]类型
[4]. getByName(Stringhost)和getAllByName(String host)的关系
getByName在源码实现中调用了getAllByName这个方法。
public static InetAddress getByName(String host)
throws UnknownHostException {
return InetAddress.getAllByName(host)[0];
}
(4). 获取
字符串形式
主机名
[1]. 方法原型
public String getHostName();
[2]. 返回值类型:
String类型
(5). 获取字符串形式IP地址
[1]. 方法原型
public String getHostAddress();
[2]. 返回值类型: String类型
(6). 举例
[1]. 测试代码1
import java.net.*;
class IPDemo{
public static void main(String[] args) throws UnknownHostException{
InetAddressi =InetAddress.getLocalHost();
System.out.println(i.toString());
System.out.println("name: "+ i.getHostName());
System.out.println("address: "+ i.getHostAddress());
InetAddressia =InetAddress.getByName("127.0.0.1");
System.out.println("name:"+ ia.getHostName());
System.out.println("address:"+ ia.getHostAddress());
}
}
测试结果
[2]. 测试代码2
InetAddress[] ias =InetAddress.getAllByName("www.baidu.com");
for(InetAddress iaItem: ias){
System.out.println(iaItem);
}
测试结果
2). 端口Port在Java中的体现
由于端口仅仅是数字标识,所以没有必要将端口封装成对象。
3). 传输协议在Java中的体现
由于TCP和UDP传输协议比较复杂,所以必须封装成Java中的类进行描述才合理。
Java仅仅将传输层常见的协议TCP和UDP分别封装成了TCP相关类和UDP相关类。
2. TCP和UDP概念
1). TCP控制传输协议
TCP协议如何确定通信的另一方存在?
TCP协议的三次握手机制
[1]. 三次握手机制的图示
[2].三次握手的必要性
{1}. 由于TCP传输协议必须是面向连接的,通信双方必须互相知道对方的存在才可以。
{2}. 第一次握手 + 第二次握手 (从通信方A的角度考虑)
通信方A发出一条消息并收到一条B的回复,从A的角度证明B是存在的。此时A单方向确定了B是存在的。
{3}. 第二次握手 + 第三次握手 (从通信方B的角度考虑)
通信方B发出一条消息并收到了A的一条回复,从B的角度证明A是存在的。此时B单方向确定了A是存在的。
【疑问】为什么前两次握手B不能确定A是存在的呢?
因为B收到A的发问之后,很可能A就不存在了,这样B如果发送的消息没有回馈。此时B没有办法确定A是否真的存在。
[3]. TCP通信双方通过三次握手之后,就完成了TCP传输通道的建立。
2). TCP和UDP协议的区别
(1). 是否面相连接
[1]. TCP: 必须面向连接。只有建立连接,才能形成数据传输通道。
TCP通讯必须确定通信的双方都存在。只有通信的双方都存在,才能进行数据传输。
[2]. UDP: 面向无连接。
采用UDP传输,通信的接收方是否存在并不影响通信过程。只要发送方存在,数据就能被传输出去。
(2). 传输的数据量的大小
[1]. TCP: 在连接中进行大数据量的传输。
{1}. 在通信双方建立好连接之后,通过TCP协议,通信双方可以在连接通道中进行大数据量数据的传输。
{2}. Java代码中体现就是通过IO读/写流或者输入/输出流来进行持续的数据传送。
[2]. UDP: 每次发送的数据报包大小都限制在64KB以内。
{1}. 数据被封装成数据报包,每个被发送的数据报的大小限制在64KB以内,因此数据报包大小有限。
{2}. Java代码中体现就是通过发送端的send方法和接收端的receive方法进行数据传输。
(3). 可靠性
[1]. TCP: 传输可靠。
由于TCP协议面向连接,所以在进行传输数据之前,必须要求通信双方建立连接。TCP协议会通过"三次握手"机制来判断通信的双方是否建立连接。这样,双方都存在并且建立连接的话,一方再发送数据,另一方一定能够接收到数据。因此传输可靠。
[2]. UDP: 传输不可靠。
由于UDP协议面向无连接,所以发送方不会因为接收方是否存在都会将数据打成数据报包进行数据发送。所以,如果接收方存在,数据就接收到了,否则数据丢失。
(4). 速度
[1]. TCP: 速度相对慢
由于发送数据前,TCP协议一定要确保通信双方全部存在并且建立连接,所以这些工作要花费时间,所以传输速度相对慢。这正是TCP协议面向连接和可靠性的特性所体现的。
[2]. UDP: 速度快
由于发送数据之前,通信双方不用建立连接,所以传输速度快。这正好是UDP协议面向无连接和可靠性差的特点所体现的。
2). UDP和TCP举例
(1). 生活中通信中常见的采用UDP协议进行数据传输的例子?
{1}. 网络聊天采用的数据传输协议就是UDP ---- 因为网络聊天数据并不重要,丢了就丢了。但是一旦聊天的时候,速度快还是必须的。
{2}. 视频会议、桌面共享的应用都追求数据传输的及时性,因此都采用UDP数据传输协议。
(2). 下载数据是采用TCP数据传输协议还是UDP数据传输协议?
一旦数据传输过程数据丢失,下载的文件便无法打开。因此下载文件必须采用TCP数据传输协议。
3. Socket基本概念
1). 对网络编程的理解
(1). 通常说的网络编程指代的什么
[1]. 所谓的网络编程就是指对Socket的编程
(2). 针对JSP、Servlet进行编程是网络编程么?
不是。JSP、Servlet是J2EE的框架组件技术。尽管他们的底层是对Socket的封装,但是直接针对JSP或者Servlet的编程并不是网络编程。
2). Socket基础知识
(1). Socket字面含义和历史
[1]. Socket这个单词的字面含义就是插座,插槽
[2]. Socket这个单词的计算机方面的释义就是套接字
早期Socket370指的是可以插有370针脚的CPU插槽
(2). Socket套接字和网卡口的类比
[1]. 网卡口
{1}. 两台主机想通讯,必须至少通过一根网线进行相连。
{2}. {1}要求每台主机后面必须有一个网卡口用来连接网线。这个用来插网线的网卡口就相当于一个插槽 (Socket的含义)
[2]. 应用程序的“网卡口”-----Socket
{1}. 想要通讯的两台主机上的应用程序也需要有一个类似于主机上的网卡口/插槽。
{2}. 在通信软件上,通信软件需要有Socket作为通信的端点。数据传输之后,传输到物理层之后,通过物理层的插在网卡口的网线将数据从一台主机传送到另一台主机的物理层。
【总结】程序方面有Socket来做数据的连接点 -----硬件上有网卡口来做网线中数据的连接点。
(3). 数据在通过Socket连接的通路中传输方式
[1]. 数据在两个Socket端点之间通过IO流进行数据传输
[2]. 网络通信实际上就是Socket间的通信。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------