1. 什么是IP地址
由此可见,32位最大为255.255.255.255
打开cmd查询自己电脑的ip地址:ipconfig
测试网络是否通畅:ping 目标ip地址
2. IP地址的组成
注意:127.0.0.1是回送地址,指本地机,一般用来测试使用
我们生活中一般使用的是C类IP地址,如:你的ip是192.168.75.5,这是你的内网ip,非内网的用户无法通过此ip连接到你的电脑。如果此时你连接的是wifi路由器,那么就可以轻松验证网络地址,192.168.75就是网络地址,可以在路由器机盒的底部信息找到,.5就是主机地址,那么也就是说,该路由器最大容量为255,即最大为192.168.75.255,除去网关等地址实际可承载最大连接设备数可能在250左右。
如图所示,假设有两个路由器,一个是192.168.75.1,一个是192.168.76.1
192.168.75.15和192.168.75.160连接着第一个路由器
192.168.76.12和192.168.76.135连接着第二个路由器
在没有连接互联网的情况下,192.168.75.15去ping 192.168.75.160是可以接受和发送数据包的,同理76,但是用75的主机去ping76的主机是无法传输的,因为他们之间没有连接。在没有外网的连接下,左边和右边的三台设备各自组成了局域网。
用百度来举例,180.101.51.73就是公网(对全球放行),www.baidu.com这个则是域名。那么什么是域名呢?
3. DNS域名解析
DNS(Domain Name System)即域名系统,是互联网的一项核心服务。域名是便于人们记忆和使用的网站地址,如www.baidu.com,而计算机在网络中通信需要使用 IP 地址,如 14.215.177.38。DNS 域名解析就是把域名转换为计算机能够识别的 IP 地址的过程。
作用和意义
- 方便记忆和使用:域名具有一定的语义和逻辑性,相比复杂的 IP 地址,更容易被用户记住和输入。
- 便于管理和维护:通过 DNS 系统,网站管理员可以方便地更改网站服务器的 IP 地址,而无需用户修改访问地址。只需要在 DNS 服务器上进行相应的配置更改,用户就可以通过域名继续访问网站,而不会受到 IP 地址变化的影响。
- 实现负载均衡:DNS 可以将同一个域名解析到多个不同的 IP 地址上,通过这种方式,可以将用户的访问请求分配到不同的服务器上,实现负载均衡,提高系统的性能和可靠性。
4. 网络服务器
邮件服务器基本不用,我们更专注于对Web服务器的使用:
- 定义:Web 服务器是一种专门用于处理和传输 Web 页面的网络服务器。它主要负责接收客户端(如浏览器)发送的 HTTP 请求,根据请求内容返回相应的 HTML 页面、图片、脚本等资源,以实现 Web 应用程序的访问和交互。
- 功能:Web 服务器的核心功能是处理 HTTP 协议,解析客户端发送的请求,并根据请求的 URL 和其他参数来定位和获取相应的资源。然后,将这些资源按照 HTTP 协议的规定进行封装和传输,返回给客户端浏览器。此外,Web 服务器还可以支持 SSL/TLS 加密,以确保数据在传输过程中的安全性;同时,它还能够进行访问控制、日志记录等管理功能,方便对网站的访问进行监控和管理。
- 常见的 Web 服务器软件
- Apache:是一款开源的、广泛使用的 Web 服务器软件。它具有高度的稳定性和可扩展性,支持多种操作系统,能够处理大量的并发请求。Apache 还拥有丰富的模块和插件,可通过各种配置文件进行灵活的定制和扩展,适用于各种规模的网站和应用程序。
我们后续会对Web服务器做更多讲解,现在只需暂时了解即可。
5. 网络通信协议(TCP/UDP)⭐(重点)
TCP⭐
- 特点
- 面向连接:在数据传输之前,需要先在发送方和接收方之间建立连接,就像打电话一样,先拨号建立连接,然后才能通话。连接建立过程通过 “三次握手” 来完成,确保双方都做好了数据传输的准备。
- 可靠传输:TCP 通过序列号、确认应答、重传机制等保证数据的可靠传输。发送方会为每个发送的数据段分配一个序列号,接收方收到数据后会发送确认应答给发送方。如果发送方在一定时间内没有收到确认应答,就会认为数据传输失败,并重传该数据段。
- 字节流传输:TCP 将数据看作是无结构的字节流,它不关心数据的具体内容和格式,只负责将字节流从发送方准确地传输到接收方。
- 流量控制与拥塞控制:TCP 具有流量控制机制,通过接收方告知发送方自己的接收窗口大小,来控制发送方的发送速度,防止发送方发送数据过快导致接收方缓冲区溢出。同时,TCP 还具备拥塞控制机制,当网络出现拥塞时,自动调整发送方的发送速率,以避免网络拥塞进一步恶化。
- 应用场景:适用于对数据准确性和完整性要求较高的场景,如文件传输、电子邮件、网页浏览、远程登录等。例如,在下载文件时,需要确保文件的每个字节都准确无误地传输到本地,TCP 的可靠传输特性就能很好地满足这一需求。
字节流对应的就是File I/O里的InputStream和OutputStream! 也就是Buffer!
UDP
- 特点
- 无连接:UDP 在数据传输时不需要先建立连接,就像写信一样,直接将信件(数据)发送出去,不需要事先与接收方打招呼。这种方式使得 UDP 的传输效率较高,延迟较小。
- 不可靠传输:UDP 不保证数据一定能被正确接收,也不提供确认应答、重传等机制。数据发送出去后,UDP 不会关心数据是否到达接收方,以及接收方是否正确接收。因此,UDP 可能会出现数据丢失、重复或乱序的情况。
- 数据报传输:UDP 将数据封装成一个个独立的数据报进行传输,每个数据报都包含源端口、目的端口、数据等信息。数据报之间相互独立,没有顺序关系。
- 无流量控制和拥塞控制:UDP 没有内置的流量控制和拥塞控制机制,发送方可以按照自己的速率发送数据,不会根据网络状况和接收方的情况进行调整。
- 应用场景:适用于对实时性要求较高、对数据准确性要求相对较低的场景,如实时视频会议、音频流传输、在线游戏等。例如,在视频会议中,偶尔丢失一些数据帧可能只会导致画面出现轻微的卡顿,但不会影响整体的会议效果,而 UDP 的低延迟特性能够保证视频和音频的实时传输,让用户获得较好的体验。
6. Socket简介(重点) ⭐
java.net 包
Socket和ServerSocket面向TCP协议,DatagramPacket和DatagramSocket面向UDP协议,InetAddress则是面向ip地址。
我们现在重点面向TCP开发。
7. 基于TCP协议的Socket编程(重点) ⭐
下面是例子详细流程:
首先我们创建两个project,一个充当Server一个充当Client
在Server中:
()内要填写的是一个端口,什么是端口呢?假设此时我们的电脑通过ip地址连接了,那么我用微信给你发送的信息你需要用微信来接收,不能歪到QQ去接收,那么此时监听微信的端口就可以锁定你的微信,从而不让信息流向错误位置的地方。端口最大为1-65535。建议使用1024以上的端口,因为1024以下的端口有可能被系统占用。
那么我们使用8888来继续操作:
现在我们创建了服务器,那么就要等待别人来连接我们,比如微信输入了账号密码以后点击登录,此时账号和密码会发送给服务器,服务器验证了账号密码看是否存在,返回一个值。我们调用一个堵塞方法来等待别人连接服务器。
输出结果:
我们发现 “有人连接了” 并没有被打印,因为并没有人来连接,所以被accept方法堵住了。
在Client中:
首先使用Socket类创建对象,然后输入目标ip地址和Sever中预设的端口。这样,我们基础的连接就完成了。
运行一下代码,回到Server中查看输出
输出结果:
接下来我们尝试发送信息!
Client:
Server:
输出结果:
接下来服务器给客户端返回一条信息,此时客户端就要关闭输出的嘴巴,打开收听的耳朵:
Client:
Server:
输出结果:
注意:使用完对应的方法后要记得在结尾关闭!
8. Socket中实现对象的传递
Java 序列化是指把 Java 对象转换为字节序列的过程,而反序列化则是把字节序列恢复为 Java 对象的过程。序列化主要用于对象的存储和网络传输。
注意:发送和接收的对象需要在同一个包名里!这是规范!
下面是例子详细流程:
在myTcpServer中创建一个com.zb.entity包,创建一个Student类:
同理,在myTcpClient创建一个com.zb.entity包,创建一个Student类。
在Server中建立一个ObjectServer:
在Client中初始化信息:
然后尝试运行,打开服务器,在Client中运行程序,会发现报错:
为什么会报错呢?因为Student这个类没有被序列化(Serializable),所以我们需要给Student类添加一个接口使其可序列化:
现在运行就不会报错了。
同样的,Server在接收该对象后也需要将其序列化,这样也可以读取信息了。
接下来进行发送接收验证操作:
Client:
Server:
我们会发现在我们写到readObject()的时候系统提示我们抛出一个ClassNotFoundException(对象没有被找到)异常,这也证明了ObjectInputStream接收的正是对象。
运行代码,输出结果:
我们发现,在我们运行代码时,每运行一次服务器都要开启一次,在现实中服务器通常365天都在运行,那么我们该如何让服务器不停的运作呢?
用while死循环可以启到这样的作用
这样Client每运行一次,客户端都会打印一次输出。
加强练习:收到学生信息后返回给客户端一条信息,代码在另一篇代码展示中。
9. 多线程处理多请求
在上面的对象传递代码中,我们给服务器休眠5秒
如果我同时有张三和李四两个人对服务器发出请求,我们会发现两个人在同一时间点发出的请求,服务器却是一个一个的处理请求:
也就是说我们服务器现在正在做单线程处理,如果张三出现了问题,那么李四就因为张三的故障从而一直等待,进不去系统,那我们该如何解决呢?
下面是例子详细流程:
首先我们在MyTcpServer中创建一个ServerSocketThread类,继承Thread父类,创建一个连接对象
然后将之前模拟的代码剪切到run方法中
接着CTRL+ALT+T选中的区域快速生成try-catch块
编写一个finally,将下面关闭流close()放进去,选中也try-catch一下
回到主线程中
这样,我们就把处理网络通信的数据处理交给了一个独立的线程来做,这个线程内实现的就是我们读和写的功能,运行两个客户端得到结果
输出结果
张三:
李四:
Server:
附录:
基于java的网络编程入门的课堂演示代码-CSDN博客
课后练习:
TCP基础题:音乐播放列表管理系统-CSDN博客
TCP基础题:电影收藏管理系统-CSDN博客