/java-io

Java IO操作总结

Primary LanguageJava

---简明Java IO---

理解IO PPT思路

- 简明通信原理
    - 网络通信架构图
    - 什么是互联网

    互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的, 所以我们先来了解 TCP/IP 的基本思路。 TCP/IP 的结构如图 1.8 所示, 就是由一些小的子网,通过路由器 A 连接起来组成一个大的网络。 这里的子网可以理解为用集线器 B 连接起来的几台计算机 C,我们将它看作一个单位,称为子网。将子网通过路由器连接起来, 就形成了一个网络 D

    - 集线器,交换机,路由器,猫(调制解调),无线AP
    - wan,lan,vlan

- 操作系统
    - Linux操作系统架构
    - 操作系统中断机制
    - 文件描述符
    - 标准输入输出
    - 网卡的工作方式

- 进程通信方式
    - TCP/IP

- 网络编程
    - Linux网络编程
    - select,poll,epoll

- Java IO发展史
    - 代码体现各种IO的工作方式

- java NIO

进程之间是如何通信的

计算机网络简明教程

IO中断

  • 网卡中断

question

  • response 什么时间返回
  • socket 返回过程
  • 网卡工作原理

linux

  • 文件描述符

accept

  • jvm accept实现方式
    • Linux for
    • Linux accept

操作系统IO操作

tcp/ip

理解

  • Java NIO就是对IO使用的封装,实现内核函数的调用

  • 非阻塞I/O有一个缺点 如果所有设备都一直没有数据到达,调用者需要反复查询做无用功,如果阻塞在那里,操作系统可以调度别的进程执行,就不会做无用功了。select(2) 函数可以阻塞地同时监视多个设备,还可以设定阻塞等待的超时时间,从而圆满地解决了这个问题。

  • 搞懂select,poll,epoll区别

Socket 编程中,TCP 流的结束标志与粘包问题(https://www.cnblogs.com/kirito-c/p/8670078.html)

因为 TCP 本身是无边界的协议,因此它并没有结束标志,也无法分包。

socket和文件不一样,从文件中读,读到末尾就到达流的结尾了,所以会返回-1或null,循环结束,但是socket是连接两个主机的桥梁,一端无法知道另一端到底还有没有数据要传输。
socket如果不关闭的话,read之类的阻塞函数会一直等待它发送数据,就是所谓的阻塞。

如果发送的东西非常多必须要用循环读,可以有以下解决方案:

调用socket的 shutdownOutput 方法(Java)关闭输出流,该方法的文档说明为,将此套接字的输出流置于“流的末尾”,这样另一端的输入流上的read操作就会返回-1。
约定结束标志,当读到该结束标志时退出不再read。 (Http 的 Transfer-Encoding: Chunked 首部,表示将以一个 length 为 0 的 chunk 做结束标志)
设置超时(timeout),会在设置的超时时间到达后抛出SocketTimeoutException异常而不再阻塞。
双方定义好通信协议,在协议头部约定好数据的长度。当读取到的长度等于这个长度时就不再继续调用read方法。(Http 的 content-length 首部,会给出主体的长度)
而如果需要发送多个相互独立的内容,内容之间就需要有明确的分界,方法有:

像 multipart-form 一样,使用 boundary 字串做分割,使用 Content-Type 等首部做内容标识。
用二进制帧做分割,在帧首部定义好帧的长度和其他信息。

references