4.5 Java之网络编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/lwz45698752/article/details/86062641
4.5