Java笔记36
网络编程
概述
- 计算机网络
- 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
- 网络编程的目的
- 利用网络传播交流信息,来实现信息传递、通信等功能。
网络通信的要素
- 要素一:IP地址 - 设备在网络中唯一的标识。
- 要素二:端口号 - 应用程序在设备中唯一的标识。
- 要素三:协议 - 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。
IP
- IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。
- IP规定网络上所有的设备都必须有一个独一无二的IP地址,就好比是邮件上都必须注明收件人地址,邮递员才能将邮件送到。同理,每个IP信息包都必须包含有目的设备的IP地址,信息包才可以正确地送到目的地。同一设备不可以拥有多个IP地址,所有使用IP的网络设备至少有一个唯一的IP地址。
IP地址
-
IP地址是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个唯一的逻辑地址,以此来屏蔽物理地址的差异。
-
127.0.0.1
是一个特殊的IP地址,表示主机本身(localhost),用于本地机器的测试。
IP地址的分类
- IPv4/IPv6:
-
IPv4和IPv6是不同类型的IP地址。它们的主要用途相同,标记不同的用户,并且让用户能通过IP进行通信。主要区别在于IPv6是最新一代的IP地址,它的可用的IP数量远大于IPv4 。
-
IPv4:如:
172.16.254.1
,以“点分十进制”表示,由4个字节组成(0~255),共32位的地址方案。IPv4地址组合的数量是有限的。总体而言,可以算出40亿个唯一地址。 早在2011年,全球互联网编号分配机构(IANA)就已经分发完了IPv4地址空间的最后一块。
-
IPv6:如:
0123:4567:89ab:cdef:0123:4567:89ab:cdef
,IPv6地址使用以冒号分隔的十六进制数字。 它分为8个16位块(无符号整数),构成一个128位地址方案。 IPv6也存在数量限制。不过可用的IP数量远大于IPv4的总数40亿个 。
-
-
公网(互联网)/ 私网(局域网):
- 由于我们国家接入国际互联网的时期比较晚,所以分配到的IP地址十分的稀少, 再者随着网络建设速度的不断加快、联网设备的持续增加,IP地址的供应更是严重不足。在早期规划IPv4 的时候,很多专家就担心IP地址会出现不足的情况,因此为了应对这个问题,IPv4地址被划分为公网IP和私网IP。
- 公网IP:公网IP属于注册地址,每个公网IP都是全球唯一的,能直接连接上网络,所以对于那些住宅小区,公司,学校,政府机构等场所,就可以集中使用私有的IP进行管理,而大家可以共用一个IP去连接上公网,这样,就省下了许多宝贵的公网IP。公网IP主要有A、B、C、D、E五类地址:
- A类:地址范围为
1.0.0.0
-127.255.255.255
,主要分配给大量主机而局域网网络数量较少的大型网络; - B类:地址范围为
128.0.0.0
-191.255.255.255
,一般用于国际性大公司和机构; - C类:地址范围为
192.0.0.0
-223.255.255.255
,用于一般小公司校园网研究机构等; - D类:地址范围为
224.0.0.0
-239.255.255.255
,用于特殊用途,又称做广播地址; - E类:地址范围为
240.0.0.0
-255.255.255.255
,暂时保留。
- A类:地址范围为
- 私网IP:私网IP属于非注册地址,只能在组织机构内部使用,不能直接连接上网络。也就是说,私网IP是不会出现在互联网上的,无法直接使用它们来访问互联网,而只能在本地连接也就是局域网中使用。私网IP主要有A、B、C三类地址:
- A类:地址范围为
10.0.0.0
-10.255.255.255
; - B类:地址范围为
172.16.0.0
-172.31.255.255
; - C类:地址范围为
192.168.0.0
-192.168.255.255
。 - 另外
127.0.0.0
-127.255.255.255
为系统环回地址。
- A类:地址范围为
域名
- 由于IP地址不方便记忆并且不能显示地址组织的名称和性质,人们设计出了域名,并通过域名系统来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。如:
www.baidu.com
。
拓展练习:测试IP地址与域名
- 下面,我们来写一段代码来测试一下IP地址与域名:
package com.clown.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
//测试 IP地址与域名
/*
InetAddress类:用来封装数字式的IP地址和该地址的域名。该类没有构造方法。
对于InetAddress,三个静态方法:getLocalHost()、getByName()以及getAllByName()可以用来创建InetAddress的实例。
*/
public class TestInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1"); //方式一
System.out.println(inetAddress1);
InetAddress inetAddress2 = InetAddress.getByName("localhost"); //方式二
System.out.println(inetAddress2);
InetAddress inetAddress3 = InetAddress.getLocalHost(); //方式三
System.out.println(inetAddress3);
//查询网站ip地址
InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress4);
//常用方法
System.out.println(inetAddress4.getCanonicalHostName()); //获取此IP地址的规范的域名
System.out.println(inetAddress4.getHostAddress()); //获取字符串格式的原始IP地址
System.out.println(inetAddress4.getHostName()); //获取此IP地址的主机名
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
- 运行结果:
端口
- 端口是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为物理端口和虚拟端口。物理端口,又称接口,是可见端口 ,用于连接物理设备之间的接口,如:集线器、交换机、路由器上用于连接其他网络设备的接口。 虚拟端口是不可见接口,用于区分服务的端口,如:用于浏览网页服务的80端口,用于FTP服务的21端口等。 我们这里讲的是虚拟端口。
端口号
-
每一个端口都有一个对应的端口号,通过端口号能找到唯一个的一个端口 。
-
如果说IP地址是一串用来区分不同网络设备的数字,通过它,我们可以将消息传给指定的设备;那么,端口号就是一串用来区分不同程序的数字,通过它,我们可以将信息传给指定的程序。
-
IP地址+端口号才能唯一确定一个特定设备中的特定程序。
端口的分类
- TCP与UDP段结构中端口地址都是16比特,可以有在0~65535范围内的端口号。
- 按照端口号分类:
- 公认端口:0~1023。它们紧密绑定于一些服务,通常这些端口的通讯明确表明了某种服务的协议。
- 常见的公认端口:
- HTTP:80
- HTTPS:443
- FTP:21
- Telnet:23
- 常见的公认端口:
- 注册端口:1024~49151。它们松散地绑定于一些服务,也就是说有许多服务绑定于这些端口,这些端口同样用于其他许多目的。
- 常见的注册端口:
- Tomcat:8080
- MySQL:3306
- Oracle:1521
- 常见的注册端口:
- 动态或私有端口:49152~65535。理论上,不应为服务分配这些端口,通常机器从1024开始分配动态端口。例外:SUN的RPC端口从32768开始。
- 公认端口:0~1023。它们紧密绑定于一些服务,通常这些端口的通讯明确表明了某种服务的协议。
- **按照协议类型分类:**按协议类型划分可分为TCP端口、UDP端口、IP端口、ICMP。
- TCP端口:即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP的21端口,Telnet的23端口,SMTP的25端口,HTTP的80端口,HTTPS的443端口。
- UDP端口:即用户数据报协议端口,无需在客户端和服务器端建立连接,安全性得不到保障。常见的DNS的53端口,SNMP(简单网络管理协议)的161端口,QQ使用的8000和4000端口。
- 保留端口:UNIX有保留端口号的概念,只有超级用户特权的进程才允许给它自己分配一个保留端口号。这些端口号介于1~1023之间,一些应用程序将它作为客户与服务器认证的一部分。
- 使用端口号的注意事项:
- 不要使用端口号为01023的端口(公认端口),也尽量不要使用端口号为4915265535的端口(动态或私有端口)。
- 单个协议下,端口号不能冲突(端口号一般习惯为4位整数,在同一台计算机上端口号不能重复,否则,会产生端口号冲突 )
拓展:端口操作常用的DOS命令
netstat -ano #查看所有的端口
netstat -ano | findstr "5900" #查看指定的端口
tasklist/findstr "8696" #查看指定端口的进程
拓展练习:测试端口
- 下面,我们来写一段代码来测试一下端口:
package com.clown.net;
import java.net.InetSocketAddress;
//测试端口
//InetSocketAddress类: 该类实现 IP套接字地址(IP地址 + 端口号),它也可以是一对(主机名 + 端口号)
public class TestInetSocketAddress {
public static void main(String[] args) {
//实例化
InetSocketAddress socketAddress1 = new InetSocketAddress("127.0.0.1", 8080);
InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
System.out.println(socketAddress1);
System.out.println(socketAddress2);
//常用方法
System.out.println(socketAddress1.getAddress()); //获得 InetAddress
System.out.println(socketAddress1.getHostName()); //获取地址
System.out.println(socketAddress1.getPort()); //获取端口号
}
}
- 运行结果:
通信协议
协议
- 通信协议是指通信各方事前约定的通信规则,可以简单地理解为各计算机之间进行相互会话所使用的共同语言。
网络通信协议
- 网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬体系结构的互联网络引提供通信支持,是一种网络通用语言。
- 网络通信协议由三个要素组成:
- 语义:解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
- 语法:用户数据与控制信息的结构与格式,以及数据出现的顺序。
- 时序:对事件发生顺序的详细说明。
- 可以形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
- 常见的网络通信协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议等。
TCP/IP协议簇
- TCP/IP是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
- 重点:
- TCP协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- UDP协议:数据报协议,是OSI(开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
- 最具代表性的协议:
- TCP协议:同上。
- IP协议:网际互连协议,是TCP/IP体系中的网络层协议,它可以向传输层提供各种协议的信息,例如TCP、UDP等; 对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。
拓展:OSI七层模型,TCP/IP四层概念模型以及对应的网络协议
对比TCP协议与UDP协议
- TCP协议:
- 有连接,类似打电话
- 可靠的,“三次握手,四次挥手”
- 分客户端和服务端
- UDP协议:
- 无连接,类似发短信
- 不可靠的,不管对方是否准备好,都可以发送
- 虽然也分客户端和服务端,但二者并没有明确地界限
“三次握手,四次挥手”
- “三次握手”:
客户端A:“我的序列号是X,我们建立连接吧。”
如果服务端B同意连接,
服务端B:“收到,我知道你的序列号是X了,我的序列号是Y,我们建立连接吧。”
客户端A:“收到,我知道你的序列号是Y了。”
建立连接。
- “四次挥手”:
客户端A停止发送数据,
客户端A:”我的序列号是X,我们释放连接吧。“
服务端B:“收到,我知道你的序列号是X了,我的序列号是Y,你确认一下。”
服务端B将最后的数据发送完毕 ,
服务端B:“收到,我知道你的序列号是X了,我的序列号是Y,你再确认一下,然后我们就释放连接吧。”
客户端A:”收到,我知道你的序列号是Y了,我已确认要释放连接。“
释放连接。