2026/1/15 19:49:11
网站建设
项目流程
泰州企业模板建站,商事登记服务工作室,鹤壁网站推广,一般建设网站的布局1. BIO (Blocking I/O) - 同步阻塞 I/O
BIO 是传统的网络编程模型#xff0c;每个连接对应一个线程#xff0c;当线程执行读/写操作时会被阻塞#xff0c;直到数据就绪。
示例#xff1a;BIO 服务器
import java.net.*;
import java.io.*;public class BioServer {publi…1. BIO (Blocking I/O) - 同步阻塞 I/OBIO 是传统的网络编程模型每个连接对应一个线程当线程执行读/写操作时会被阻塞直到数据就绪。示例BIO 服务器importjava.net.*;importjava.io.*;publicclassBioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserverSocketnewServerSocket(8080);System.out.println(BIO Server started on port 8080);while(true){SocketclientSocketserverSocket.accept();// 阻塞等待客户端连接newThread(()-{try{BufferedReaderinnewBufferedReader(newInputStreamReader(clientSocket.getInputStream()));PrintWriteroutnewPrintWriter(clientSocket.getOutputStream(),true);Stringrequest;while((requestin.readLine())!null){// 阻塞读取数据System.out.println(Received: request);out.println(Echo: request);// 响应客户端}clientSocket.close();}catch(IOExceptione){e.printStackTrace();}}).start();}}}特点每个连接一个线程适合连接数少的场景。编程简单但线程开销大无法应对高并发。2. NIO (Non-blocking I/O) - 同步非阻塞 I/ONIO 基于 Channel 和 Selector使用单个线程管理多个连接通过事件驱动机制实现非阻塞。示例NIO 服务器importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.*;publicclassNioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketChannelserverChannelServerSocketChannel.open();serverChannel.bind(newInetSocketAddress(8080));serverChannel.configureBlocking(false);// 非阻塞模式SelectorselectorSelector.open();serverChannel.register(selector,SelectionKey.OP_ACCEPT);// 注册接受连接事件System.out.println(NIO Server started on port 8080);while(true){selector.select();// 阻塞直到有事件发生SetSelectionKeykeysselector.selectedKeys();IteratorSelectionKeyiterkeys.iterator();while(iter.hasNext()){SelectionKeykeyiter.next();iter.remove();if(key.isAcceptable()){ServerSocketChannelserver(ServerSocketChannel)key.channel();SocketChannelclientserver.accept();client.configureBlocking(false);client.register(selector,SelectionKey.OP_READ);// 注册读事件System.out.println(Client connected: client.getRemoteAddress());}elseif(key.isReadable()){SocketChannelclient(SocketChannel)key.channel();ByteBufferbufferByteBuffer.allocate(1024);intreadclient.read(buffer);// 非阻塞读取if(read0){buffer.flip();byte[]datanewbyte[buffer.remaining()];buffer.get(data);StringrequestnewString(data);System.out.println(Received: request);// 响应客户端ByteBufferresponseByteBuffer.wrap((Echo: request).getBytes());client.write(response);}elseif(read-1){client.close();}}}}}}特点单线程处理多连接减少线程开销。复杂度较高需要处理事件循环和缓冲区。3. AIO (Asynchronous I/O) - 异步非阻塞 I/OAIO 基于回调机制应用程序发起 I/O 操作后立即返回当操作完成时系统会通知应用程序。示例AIO 服务器importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.concurrent.*;publicclassAioServer{publicstaticvoidmain(String[]args)throwsIOException{AsynchronousServerSocketChannelserverAsynchronousServerSocketChannel.open();server.bind(newInetSocketAddress(8080));System.out.println(AIO Server started on port 8080);// 接受连接的回调server.accept(null,newCompletionHandlerAsynchronousSocketChannel,Void(){Overridepublicvoidcompleted(AsynchronousSocketChannelclient,Voidattachment){server.accept(null,this);// 继续接受下一个连接ByteBufferbufferByteBuffer.allocate(1024);// 读取数据的回调client.read(buffer,buffer,newCompletionHandlerInteger,ByteBuffer(){Overridepublicvoidcompleted(IntegerbytesRead,ByteBufferbuffer){if(bytesRead0){buffer.flip();byte[]datanewbyte[buffer.remaining()];buffer.get(data);StringrequestnewString(data);System.out.println(Received: request);// 响应客户端ByteBufferresponseByteBuffer.wrap((Echo: request).getBytes());client.write(response,null,newCompletionHandlerInteger,Void(){Overridepublicvoidcompleted(Integerresult,Voidattachment){try{client.close();}catch(IOExceptione){e.printStackTrace();}}Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});}}Overridepublicvoidfailed(Throwableexc,ByteBufferattachment){exc.printStackTrace();}});}Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});// 保持服务器运行Thread.currentThread().join();}}特点完全异步基于回调或 Future性能高。编程模型复杂适合连接数多且长连接的场景。对比分析特性BIONIOAIO模型同步阻塞同步非阻塞多路复用异步非阻塞线程数一个连接一个线程一个线程处理多个连接少量线程回调驱动吞吐量低线程上下文切换开销大中高高编程复杂度简单复杂需处理 Selector 等非常复杂回调地狱适用场景连接数少、固定架构连接数多、短连接如聊天连接数多、长连接如文件传输JDK 版本Java 1.0Java 1.4Java 1.7总结BIO简单但性能差适合低并发场景。NIO性能较好复杂度高适合高并发短连接Netty 基于 NIO。AIO性能最佳但编程复杂在 Linux 上优势不明显Linux 对 AIO 支持有限常用 NIO。实际项目中NIO 框架如 Netty使用最广泛平衡了性能和复杂度。