为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第20天 IO 相关面试问题

标签:
Android

课程名称BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Java 高级技术点面试问题
主讲老师DocMike

课程内容

Java 网路编程

1. IP 地址,IP 地址用来标识网络中的一个通信实体的地址,通信实体可以说计算机,路由器等。比如互联网中的每个服务器都要有自己的 IP 地址,而每个局域网的计算机要通信也要配置 IP 地址。

2. 端口,IP 地址用来标识一台计算机,但是计算机上可能有多个网络应用程序,如何来区分这些程序呢?这就要用端口。端口是虚拟的概念,并不是说主机上真的有端口。通过端口,可以在一个主机上运行多个网络应用程序。端口的表示是一个16位的二进制整数,对应十进制0-65535。

3. URL,统一资源定位符。在 www 上每一信息资源都有统一且唯一的地址,该地址就叫做URL,它是 www 的统一资源定位符。URL由四个部分组成:协议,存放资源的主机域名,资源文件名和端口号。如果未指定该端口号,则使用的协议默认的端口。例如 http 协议的默认端口号80,在浏览器访问网页时,地址栏显示的地址就是 URL。

4. TCP 协议和 UDP 协议,TCP 协议和 UDP 协议是传输层的两种协议。Socket 是传输层供给应用层的编程接口,所以 Socket 编程就分为 TCP 编程和 UDP 编程两类。在网络通讯中,TCP 方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。

而 UDP 方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。这两种传输方式都在实际的网络编程中使用,重要的数据一般使用 TCP 方式进行数据传输,而大量的非核心数据则可以通过 UDP 方式进行传递,在一些程序中甚至结合使用这两种方式进行数据传递。由于 TCP 需要建立专用的虚拟连接以及确认传输是否正确,所以使用 TCP 方式的速度稍微慢一些,而且传输时产生的数据量要比 UDP 稍微大一些。

总结一下就是:TCP 是面向连接的,传输数据是安全的,稳定的,效率相对较低。UDP 是面向无连接的,传输数据是不安全的,但是效率较高。

5. InetAddress,java.net.InetAddress 类是 Java 对 IP 地址(包括 IPv4 和 IPv6)的高层表示。大多数其他网络都要用到这个类哦,包括 Socket、ServerSocket、URL等等。一般情况下,它包括一个主机名和一个 IP地址。

Socket 连接

Socket 实际是传输层供给应用层的编程接口。Socket 就是应用层与传输层之间的桥梁。使用 Socket 编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过 Internet 在全球范围内通信。套接字 Socket 是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点关闭连接。套接字与主机地址和端口地址相关联。主机地址就是客户端或服务器程序所在的主机的 IP 地址。端口地址是指客户端或服务器程序使用的主机的通信端口。在客户端和服务器中,分别创建独立的 Socket,并通过 Socket 的属性,将两个 Socket 进行连接,这样客户端和服务器通过套接字所建立的连接使用输入输出流进行通信。

Socket 客户端连接步骤:

  1. 创建 Socket 对象;
  2. 连接建立后,通过输出流向服务端发送请求信息;
  3. 通过输入流获取服务器响应的信息;
  4. 关闭相应资源。

Socket 服务端连接步骤:

  1. 创建 ServerSocket 对象,绑定监听端口;
  2. 通过 accept() 方法监听客户端请求;
  3. 连接建立后,通过输入流读取客户端发送的请求信息;
  4. 通过输出流向客户端发送信息;
  5. 关闭相应资源。

Java BIO

BIO 同步阻塞式 IO,IO 的传输过程是首先在服务端启动一个 ServerSocket 来监听网络请求,客户端启动 Socket 发起网络请求,默认情况下 ServerSocket 会建立一个线程来处理此请求,如果服务端没有线程可用,客户端则会阻塞等待或遭到拒绝。

建立好的连接,在通讯过程中,是同步的。在并发处理效率上比较低。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。

Java NIO

NIO 同步非阻塞式 IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。

NIO 与 BIO 最大的区别就是只需要开启一个线程就可以处理来自多个客户端的 IO 事件,实现原理就是多路复用器,可以监听来自多个客户端的 IO 事件。一个线程中就可以调用多路复用接口(java中是select)阻塞同时监听来自多个客户端的 IO 请求,一旦有收到 IO 请求就调用对应函数处理。 一旦有请求到来(不管是几个同时到还是只有一个到),都会调用对应 IO 处理函数处理,所以:

  • NIO 适合处理连接数目特别多,但是连接比较短(轻操作)的场景。
  • BIO 方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

课程收获

这一节重点讲了 Java 中 IO 相关的一些技术点,详细介绍了 Socket 实现客户端和服务端通信的过程,通过对比的方式,介绍了 BIO 和 NIO。

图片描述
图片描述
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
12
获赞与收藏
17

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消