Java网络编程:解读java.io与Socket概述

Java网络编程:解读java.io与Socket概述

一、javaio之字节流

1.1 网络编程的本质是进程间的通信

比如说客户端浏览器进程想从服务器端接收不同的网页、文件等等,就需要想服务器发送请求,服务器端接收到请求就返回数据。这里便是两个进程之间数据的交换

1.2 通信的基础是IO模型

如果我们站在一个应用进程的角度来看,假设我们有个数据源,需要把数据源输入到应用进程里,对于应用来说这一串数据便是输入流Java中的对象如果实现了Serializable()接口,便可以写入一个文件,再从一个进程中读取出来,再恢复为Java对象。如果从应用输出数据,对于应用便是输出流

1.3 java.io操作各种流

字符流:在流中处理字符,例如char中一个可读性字符可等于两个字节

字节流:在流中处理字节,最基本的程序操作单位
Java网络编程:解读java.io与Socket概述
字符流中Reader跟Writer都是抽象类,如果处理的是CharArray是从Char数组中读取数据,处理的是String是从String中不停读取数据,CharArray跟String都是基础的

Java中还有更复杂的Reader跟Writer,例如BufferedReader、FilterReader、InputStreamReader,在创建它们的时候还需要传入Reader,它们依靠另外的Reader进行工作:

  • BufferedReader提供缓冲区
  • FilterReader是个抽象类,对读入的字符流进行处理
  • InputStreamReader把字节流转换为字节流,最常见的子类为FileReader,FileReader从硬盘读取的字节流,但是会自动转换为字节流,提高文件的可读性

Java网络编程:解读java.io与Socket概述

字节流基础的由ByteArrayInputStream、FileInputStream,File里面存储的数据就是一个个字节,如果我们不需要转换的化可以不使用FileReader,直接使用FileInputStream

Java中FileInputStream是抽象类,并且需要传入一个InputStream才可以进行工作,它提供两个复杂的子类,BufferedInputStream与DataInputStream

  • BufferedInputStream提供缓冲区
  • DataInputStream要与DataOutputStream结合,例如在Java中有一些基本数据类型,可以使用DataOutputStream把这些基本数据类型的变量输出出去,再利用DataInputStream读取,这时候可以直接转换为基本数据类型

Java网络编程:解读java.io与Socket概述

1.4 java.io里面的装饰模式

以BufferedInputStream为例,在创建BufferedInputStream的时候,需要传入InputStream作为参数,这样的运作方式说明可以对各式各样的InputStream来提供缓冲区

InputStream为抽象类,我们便可以传入它的任意子类,例如FileInputStream,但BufferedInputStream任然具备了FileInputStream的功能,任然可以从文件中读取数据,也有缓冲区功能
Java网络编程:解读java.io与Socket概述

二、Socket概述

2.1 Socket是一种数据源

Socket类似于我们的电源插座,当我们接通电源了传输的便是电流,当我们绑定了Socket之后,我们便可以传输数据流,我们可以认为Socket是一个网络的端点,如下图,服务器利用IP跟PORT唯一标识一个进程,可以把一个Socket绑定到这个IP与PORT中,这个Socket可以理解为服务器进程这一端与其他网络进程进行通信的端点

Java网络编程:解读java.io与Socket概述

2.2 通过Socket发送数据

第一步:创建Socket,就是我们抽象层面上讲的网络通信的端点

第二步:告诉网卡驱动程序,所有和这个IP与Port相关的数据输入输出,绑定到第一步创建的Socket

第三步:应用进程把数据发送到Socket中

第四步:Socket把收到的数据发送到驱动程序,由于之前的绑定,驱动程序知道这些数据是从哪个应用进程发出的,驱动程序就从网卡把数据发送到目的地

Java网络编程:解读java.io与Socket概述

2.3 通过Socket接收数据

第一步:创建Socket,就是我们抽象层面上讲的网络通信的端点

第二步:告诉网卡驱动程序,所有和这个IP与Port相关的数据输入输出,绑定到第一步创建的Socket

第三步:网卡接收到的数据识别到数据送往到IP与Port相关的数据已经绑定到Socket中,便把数据传送给Socket

第四步:应用进程再从Socket中读取数据

卡接收到的数据识别到数据送往到IP与Port相关的数据已经绑定到Socket中,便把数据传送给Socket

第四步:应用进程再从Socket中读取数据

Java网络编程:解读java.io与Socket概述