版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwz45698752/article/details/86062641
文章目录
概述
-
实现网络通信,要满足两个要素
- 定位网络主机(IP地址指明主机,端口号指明应用程序)
- 通信方式:按照通信协议标准实现通信。根据通信协议,分为TCP和UDP(以传输层叫UDP的形式命名的)
-
URL:统一资源定位符,从地址获取资源
-
本章看作I/O章节的拓展,因为可把硬盘文件看作资源,也可看作网络中对话的内容——》如何在网络中实现I/O(网络编程)
-
Java语言可以在浏览器端使用,也可以与远程服务器端进行交互
-
网络编程主要位于net包下,Java封装细节,对外提供统一类库,可实现跨平台连接
-
计算机网络:物理计算机通过网络连接来共享信息
- OSI模型:网络分为七层,每层有对应协议
- 关注各层的具体实现(协议)
- 远程传输协议HTTP,FTP属于应用层
- IP协议是网络层的,TCP,UDP是传输层的
- 为什么要多层传输:为了保证传输可靠(类比快递的层层包装)
- IP:互联网的一个协议简称
- 子网掩码:用于区分IP地址段(如网络段,主机段),子网掩码又分为A网,B网,C网,255表示C网
- 本地回环地址:自己访问自己时的IP地址
InetAddress
- 上图为传入域名的打印结果
- 该类是表示IP地址的类,该类的一个对象对应一个IP地址
- 该类的构造器不能直接访问
- 通过String类型形参指明该类对象的表示内容(IP地址内容)
- 可传入**域名(网站名)**来找到对应的IP地址(前提:联网)
- IP地址一一对应域名
- 上图为传入IP地址的打印结果,可见其没有涉及域名,直接打印IP地址
- 域名=主机名=hostname
- 域名内容发送到DNS(域名解析服务器)中,解析为对应的IP地址,再反馈回来,再通过IP地址访问网络服务器中对应的网站(域名与IP地址一一对应的关系先在本机的hosts文件中寻找)
- 实现网络编程使用socket类(网络编程又称为socket编程)
网络通信协议概述
- 网络通信协议定义通信方式,即满足一定的规则,称为协议
- TCP协议:传输前要完成三次握手(完成握手再传输),但程序中不显式写出,为了保证连接可靠,特点:可靠
- 我要发送
- 接收
- 告诉:我接收到你发送得信息了,可以开始了
- UDP协议:封装成数据包(数据报,有大小限制,每个小包都独立记录目标端口号和IP地址,然后瞬间一顿发送出去),特点:速度快。类比导弹集群攻击
- 服务器端下载视频(服务器端发送数据到客户端):视频传输使用UDP(允许丢失数据,视觉暂留现象,而若使用TCP,其因为要保证数据的连续性(不丢失数据),当网络中断,数据卡住不动,等待数据传输,造成视频卡顿)
Socket类
- Socket为Java中的类,通信两端都要有该类的对象
- 网络传输本质上还是以流的形式进行I/O传输,要求两端以socket实现
- 网络开发分为C/S架构(客户端服务端)和B/S架构(浏览器是客户端,服务器)
- 利用Socket类实现TCP或UDP传输(网络编程=两端socket间编程)
- AIT+/:提示
TCP实例一(单向)
客户端
- 以流形式向外传输:outputstream(抽象类)
- 抽象类来接收,不用指明具体实现类,即使强转也不正确,实际运行时是返回outputstream的子类对象
- 不能直接throws因为要保证稀有资源一定关闭
服务端
- Serversocket构造器只有一个参数,只需要指明自身端口号,因为系统会自动记录运行程序的主机IP地址
- 没法让ss(Serversocket对象)直接实现接收流,要先accept,返回Socket对象
- 服务端先创建的是serversocket来返回socket而不是直接创建socket对象
- 一定是socket来接收流
- 从后往前关稀有资源
修改(新的方法)
运行结果
- 先开服务端,在开客户端(否则直接连接失败,停止运行)
- 点击小电脑图表切换服务端和客户端
TCP实例二(双向)
未处理异常客户端
- 缺了个shutdown—方法
未处理异常服务器端
客户端
- 关注shutdownOutput方法的重要性,原因见下
- 程序流程:客户端向输出流写——》写完发送,服务器端接收(当不添加shutdown方法时,由于read方法是阻塞式方法,服务器端不知道什么时候发送结束,一直接执行read操作)
- 说到底,本例中还是服务器端阻塞了(不知道输入何时结束,PS:对于客户端是输出)
- 几个异常并列到finally块中,在每个if块里都try/catch了,保证每个流都能关闭
服务端
- 节点流的read方法是阻塞式方法,缓冲流则不然
- fileinputstream为基本的节点流,is是输入流(inputstream为抽象类)的子类对象,类比fileinputstream,其read方法也是阻塞式方法
- 发送反馈消息,还使用那个socket(os = s.getOutputStream())
虽然在大多数的时候可以直接使用Socket类或输入输出流的close方法关闭网络连接,但有时我们只希望关闭OutputStream或InputStream,而在关闭输入输出流的同时,并不关闭网络连接。这就需要用到Socket类的另外两个方法:shutdownInput和shutdownOutput,这两个方法只关闭相应的输入、输出流,而它们并没有同时关闭网络连接的功能。
TCP实例三
客户端
- 先从本地读入,再通过socket写出去(os.write方法)
- 一进来,还得读,然后输出到控制台上
服务端
修改
- 添加红线代码,查看发送源
- 文本处理即字符串处理
Tomcat服务器与浏览器
- 浏览器作为客户端,Tomcat服务器作为服务端
- 使用浏览器访问服务器,可读取其中资源,浏览器是访问网络资源的窗口
- Tomcat服务器默认为8080端口
- 可通过URL存到本地(类比迅雷下载)
-
客户端操作数据库流程:
-
通过Internet连接web服务器,然后web服务器调用相应的应用服务器,然后获取数据库的信息,然后再反馈回来
TCP实例四
客户端
- 异常仿前文自行处理
- scanner也是稀有资源,要关闭
- if语句保证对象有创建,防止空指针异常
- 程序流程:获取输出流,然后向服务端发送内容
- 要向程序写入数据,考虑使用System.in(默认为键盘)
- 将数据写入程序然后发送数据的方式:1.使用I/O流先作个转换,然后发送数据 2.使用scanner读取数据,然后发送数据
- 客户端与服务端说到底仍然通过socket通信
服务端
- 服务端获取输入流,且要明晓:只要是输入的,考虑使用字节数组来接收(写入到字节数组,最终由string接收)
- 此处未处理异常,仿照前文
- 一处修正,不然返回的字符串是NULL开头的
TCP总结
- remember网络通信流程
- 客户端发送完要shutdown,则服务端read解除阻塞状态,执行下方语句
- socket:船只
- serversocket:港口(用于停泊)
- accept表示港口可接收船只,然后等待船只过来(类似于造了一个船只,相当于船只发送过来)
- getInput:卸货
UDP
概述
- 数据报:datagrampacket,不在socket中指明目标地址,而在数据报中指明
- UDP通信:接收未开启,同样发送,所以可能会丢失
实例
发送端
- 首先创建socket(造船),然后装货并发送
- DatagramPacket的构造器表明:从数组b的索引0处开始发,发完byte数组的数据
- 本质还是通过数据报发送和接收
接收端
- DatagramPacket的构造器表明:数据报由b来接收,从0开始写,直到写完,即定义b.length长度来写
- 接收到数据报中,即接收到byte数组中
URL编程
- 应用程序下存在的文件名
- 获取文件的相对位置=获取文件的引用
- 创建文件,填入文件的路径——》创建URL对象,填入资源的路径
- URL类对象对应一网络资源
- URL类没有输出方法,只有输入方法,要想输出要使用URLConnection