您的位置:首页 > 娱乐 > 八卦 > 独立站制作公司_秦皇岛吧最新事件_百度视频推广_自己可以创建网站吗

独立站制作公司_秦皇岛吧最新事件_百度视频推广_自己可以创建网站吗

2025/4/18 12:50:07 来源:https://blog.csdn.net/a1241436267/article/details/146428273  浏览:    关键词:独立站制作公司_秦皇岛吧最新事件_百度视频推广_自己可以创建网站吗
独立站制作公司_秦皇岛吧最新事件_百度视频推广_自己可以创建网站吗

IO和NIO的区别:

  1. IO:通过流处理数据,仅支持阻塞IO。
    核心组件:InputStream /OutputStream用于字节的读写,Reader / Writer:用于字符流的读写。读取过程中无法被中断,是阻塞式IO。
  2. NIO:通过管道处理数据,支持阻塞IO和非阻塞IO。
    核心组件:Channel通道、Buffer缓冲区、Selector选择器。Channel与Buffer做直接交互,用于数据的传输,支持非阻塞IO,Buffer用于存放数据,Selector用于管理多个管道,允许单个线程处理多个IO。


Channel与Buffer联调

阻塞IO案例

ServerSocketChannel.accept():该方法用于等待客户端连接,直到有客户端连接才会返回,如果没有客户端连接则会一直阻塞。

SocketChannel.read(ByteBuffer):改方法用于接收客户端的数据,直到有数据才会返回,否则将一直阻塞线程。

    package com.jiawa.netty.server;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.List;import static com.jiawa.netty.utils.ByteBufferUtil.debugAll;public class Server {private static final Logger logger = LoggerFactory.getLogger(Server.class);public static void main(String[] args) throws IOException {//创建缓存、缓存客户端信息ByteBuffer buffer = ByteBuffer.allocate(16);//创建服务器ServerSocketChannel server = ServerSocketChannel.open();//绑定端口server.bind(new InetSocketAddress(8080));//创建客户端存储集合List<SocketChannel> clients = new java.util.ArrayList<>();//接收客户端while (true) {//阻塞线程,直到有客户端请求连接后释放SocketChannel client = server.accept();//如果有客户端请求,则返回客户端信息logger.info("收到客户端请求:{}", client);clients.add(client);for (SocketChannel c : clients) {//读取客户端数据int read = c.read(buffer);if (read > 0) {logger.info("读取客户端数据:{}", read);//打开读buffer.flip();//打印数据debugAll(buffer);//清空buffer.clear();}}}}}

非阻塞IO案例

server.configureBlocking(false):将 ServerSocketChannel 设置为非阻塞模式。

client.configureBlocking(false):将每个 SocketChannel 设置为非阻塞模式。

设置为非阻塞之后,则不会阻塞线程,不管是否有客户端连接或者接收客户端数据,都会直接返回,不会阻塞线程。

package com.jiawa.netty.server;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.List;import static com.jiawa.netty.utils.ByteBufferUtil.debugAll;public class Server {private static final Logger logger = LoggerFactory.getLogger(Server.class);public static void main(String[] args) throws IOException {//创建缓存、缓存客户端信息ByteBuffer buffer = ByteBuffer.allocate(16);//创建服务器ServerSocketChannel server = ServerSocketChannel.open();//非阻塞if (server!= null){server.configureBlocking(false);}//绑定端口server.bind(new InetSocketAddress(8080));//创建客户端存储集合List<SocketChannel> clients = new java.util.ArrayList<>();//接收客户端while (true) {//阻塞线程,直到有客户端请求连接后释放SocketChannel client = server.accept();//将客户端设置为非阻塞if (client != null) {client.configureBlocking(false);}//如果有客户端请求,则返回客户端信息if (client != null) {logger.info("收到客户端请求:{}", client);clients.add(client);}for (SocketChannel c : clients) {//读取客户端数据int read = c.read(buffer);if (read > 0){logger.info("读取客户端数据:{}", read);//打开读buffer.flip();//打印数据debugAll(buffer);//清空buffer.clear();}}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com