-
描述
- 通过数据流、序列化和文件系统提供系统输入和输出。 I/O执行的两大阶段
- 1.等待数据准备好,到达内核空间 (Waiting for the data to be ready) ;
- 2.从内核向进程复制数据 (Copying the data from the kernel to the process)
IO模型 | 简称 | 适用场景 |
---|---|---|
阻塞IO | BIO | 适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中 |
非阻塞IO (jdk1,4支持) | NIO(线程池) | 适用于连接数目多且连接比较短(轻操作)的架构–>聊天室 ( IO性能提升(操作系统决定) / Netty默认使用) |
异步IO (jdk1,7支持) | AIO(事件驱动,回调) | 适用于连接数目多且连接比较长(重操作)的架构, —>图片服务器 |
socket 通讯流程
代码示例
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 同步阻塞IO模型
*/
public class BIOServer {
/**
* 服务端网络IO模型的封装对象
*/
ServerSocket server;
public BIOServer(int port) {
try {
server = new ServerSocket(port);
System.out.println("BIO服务已启动,监听端口是:" + port);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 开始监听,并处理逻辑
*/
public void listen() throws IOException {
//循环监听
while (true) {
//等待客户端连接,阻塞方法
//Socket数据发送者在服务端的引用
Socket client = server.accept();
//网络客户端把数据发送到网卡,机器所得到的数据读到了JVM内中
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String msg = reader.readLine();
System.out.println("收到客服端消息:" + msg);
//输出数据给网络客户端
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
writer.write("ok\n");
writer.flush();
}
}
public static void main(String[] args) throws IOException {
// 启动并监听
new BIOServer(8080).listen();
}
}
import java.io.*;
import java.net.Socket;
import java.util.UUID;
/**
* BIO客服端
*/
public class BIOClient {
public static void main(String[] args) throws IOException {
Socket client = new Socket("localhost", 8080);
//客服端给服务器发送消息
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
UUID uuid = UUID.randomUUID();
System.out.println("客服端给服务器发送消息:"+uuid);
//注意 \n 表示已经已经写完
writer.write(uuid+"\n");
writer.flush();
//客服端收到服务端返回消息
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String msg = reader.readLine();
System.out.println("客服端收到服务端返回消息:" + msg);
}
}