*阿炮的Java笔记010号*-学会网络编程,又可以在不会编程的人面前装13了!

52 阅读6分钟

老生常谈…对于大佬们根本都不用看的博客!

对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!

网络编程

介绍

网络编程 ,就是通过某种通信协议,实现两台计算机的通信的程序。接下来让我带你了解网络编程吧!

网络的通信协议

介绍

计算机网络可以让多台计算机进行连接,在同一个网络下的计算机进行连接和通信都要遵守规则,我们称之为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一的规范,双方必须达成一致遵守规范才能完成数据的交换。 接下来就是介绍最熟悉的TCP/IP协议了!不懂?出门百度!

通信协议模型

废话不多说直接上图:

通信模型.png

图上共两种协议模型,其中OSI的模型过于理想,没有进行大范围的推广;TCP/IP协议就是现在的国际标准。 TCP/IP协议又称传输控制/因特网互联协议,它定义了计算机如何连入因特网以及数据传输的标准。它采用了4层的分层模型。由上到下咱们简单介绍一下,其他详解随便搜搜都有,太多了其实我也看不下去。

  • 应用层:主要负责应用程序的协议;
  • 传输层:主要负责网络程序的通信;
  • 网络层:主要就是将传输的数据进行分组打包,送到目标计算机或网络;
  • 网络访问层:主要就是定义物理传输的通道,大概意思就是网络驱动呗; 根据自己的理解写的,不喜勿喷!详情请出门百度!

传输层有两个重要的TCP 和 UDP 协议,拿出来简单说一说,有很多优秀的文章,可以自行搜索一下。

TCP 和 UDP 协议

UDP的简介

  • 统称用户数据报协议
  • 非面向连接,不可靠:只管发送,不管数据到不到达,这不是纯纯的看运气?
  • 数据大小被限制在64kb以内,超出这个范围的就不发送了
  • 数据报是它的基本单位
  • 应用场景:视频,音频这些场景。因为丢帧什么的影响不大,如果网络差可苦了曾经上网课的我了。

TCP的简介

  • 统称传输控制协议
  • 面向连接,可靠: 只要双方进行连接,才能进行发送。如果数据发送失败,他会进行重发,保证数据完整的发送到甲方(嘿嘿,懂得都懂)!
  • 应用场景:下载文件、浏览网页等

其中三次握手和四次挥手是它的核心,也是面试的高频问题。我就不放图了,我看多了也吐。就两个角色,一个客户端,一个服务器。

还有一些标识,我介绍一下。

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

seq(Sequence number顺序号码)

ack(Acknowledge number确认号码)

FIN(finish 结束)

三次握手

第一次:客户端携带着SYN和seq向服务器请求连接。

第二次:服务器会拿着SYN,ACK,seq,ack去找是哪个客户端发来的并告诉它可以进行连接。

第三次:客户端拿着SYN,seq,ack告诉服务器它也可以进行连接。

为什么是三次而不是两次呢? 就好比你想去搭讪美女,你不得上来说一句hello? 她回复你hello了,你才能进行下一步深入交流吧!

四次挥手

第一次:客户端拿着FIN,seq去告诉服务器它像断开

第二次:服务器拿着ACK,seq,ack。服务器收到客户端想要断开的想法,将最后的数据传给客户端,然后服务器不再接受任何数据

第三次:服务器发送完成数据后,会带着FIN,ACK,seq,ack去告诉客户端它可以进行断开了

第四次:客户端收到服务器可以断开连接的信息后,然后拿着ACK,seq,ack直接告诉服务器分手。然后服务器就会彻底的断开,客户端等待2MSL后没有接收到服务器的任何信息,就彻底断开

网络编程三要素

通信协议

计算机网络通信必须遵守的规则

IP地址

互联网协议地址(Internet Protocol Address),简称IP,就是服务器所在的位置。自己访问自己的地址就是127.0.0.1。

分类:

  • IPv4 :是一个 32 位的二进制数,通常被分为 4 个字节,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其中 a、b 、c 、d 都是 0 ~ 255 之间的十进制整数,那么最多可以表示 42 亿个。
  • IPv6 :由于互联网的蓬勃发展,IP 地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。为了扩大地址空间,拟通过 IPv6 重新定义地址空间,采用 128 位地址长度,每 16 个字节一组,分成 8 组十六进制数,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 ,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。

端口

通过IP知道了服务器的位置,但是服务器里有很多应用程序,所以出现了端口的概念。每个应用程序都有相应的端口。 端口号:用两个字节表示的整数,它的取值范围是 0~65535

  • 公认端口:0 ~ 1023 。被预先定义的服务通信占用,如:HTTP(80),FTP(21),Telnet(23)
  • 注册端口:1024 ~ 49151 。分配给用户进程或应用程序。如:Tomcat(8080),MySQL(3306),Oracle(1521)
  • 动态/ 私有端口:49152 ~ 65535

在运行的端口号只能是唯一的,如果你再启动一个相同的端口号,你根本起不来!就跟蹲茅坑一样,有人在蹲着这个茅坑呢,你咋蹲?只能换个空的茅坑呗!通俗易懂,言简意赅

总结

利用 协议 + IP地址 + 端口号 的组合就能进行网络通信!

InetAddress 类

通过InetAddress类的方法,我们可以对IP进行获取和操作

//根据域名获取InetAddress对象
public static InetAddress getByName()
//获取本机的InetAddress对象
public static InetAddress getLocalHost()
//获取InetAddress对象的IP地址
public String getHostAddress()
//获取InetAddress对的主机名
public String getHostName()

Socket

网络通信其实就是Socket 间的通信,通信的两端都要有Socket。

分类

  • 流套接字:使用 TCP 提供可以来的字节流服务。ServerSocket服务器套接字,Socket客户端套接字。
  • 数据报套接字:使用 UDP 提供的数据报服务。DatagramSocket,UDP用来发送和接收的套接字。

这么一看UDP好简洁,不过即将迎来新时代可能将UDP推送到最高的位置!可以看其他牛人博主的文章了解即可!