【Netty 网络通信】传统IO方式处理网络IO数据

简介: 【1月更文挑战第9天】【Netty 网络通信】传统IO方式处理网络IO数据

传统IO方式处理网络IO数据:

服务端首先创建一个serverSocket来监听8080端口,然后创建一个线程,线程里不断调用阻塞方法serverSocket.accept()获取新连接。

当获得新连接之后,为每一个新连接都创建一个新线程,这个线程负责从该连接中读取数据;然后以字节流方式读取数据。

下面是传统的IO编程中的客户端实现。

// 创建一个传统网络IO(Socket),监听8080端口:
ServerSocket serverSocket = new ServerSocket(8080);
// 使用子线程获取连接:
new Thread(() -> {
    while (true) {
        // 阻塞方法获取新连接:
        try {
            Socket socket = serverSocket.accept();
            // 为每一个新连接都创建一个新线程,负责读取数据:
            new Thread(() -> {
                try {
                    int len;
                    byte[] data = new byte[1024];
                    // 采用字节流的方式读取数据:
                    InputStream inputStream = socket.getInputStream();
                    while ((len = inputStream.read(data)) != -1) {
                        System.out.println(new String(data, 0, len));
                    }
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }).start();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}).start();

客户端的代码相对简单,连接上服务端8080端口之后,每隔两秒,我们都向服务端写一个带有时间戳的hello!

IO编程模型在客户端较少的情况下运行良好,但是对于客户端比较多的业务来说,单机服务端可能需要支撑成千上万个连接,IO模型可能就不太合适了,我们来分析一下原因。

在上面的示例中,从服务端代码可以看到,在传统的IO模型中,每个连接创建成功之后都需要由一个线程来维护,每个线程都包含一个while死循环,那么1万个连接对应1万个线程,继而有1万个while死循环,这就带来如下几个问题。

  1. 线程资源受限:线程是操作系统中非常宝贵的资源,同一时刻有大量的线程处于阻塞状态,是非常严重的资源浪费,操作系统耗不起。
  2. 线程切换效率低下:单机CPU核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降。
  3. 除了以上两个问题,在IO编程中,我们看到数据读写是以字节流为单位的。

为了解决这3个问题,JDK 1.4版本之后提出了NIO

new Thread(() -> {
    try {
        // 建立Socket连接:
        Socket socket = new Socket("127.0.0.1", 8080);
        while (true) {
            try {
                // 通过Socket向目标地址写数据:
                socket.getOutputStream().write((new Date() + ": hello !").getBytes());
                Thread.sleep(2000);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}).start();
相关文章
|
1天前
|
存储 缓存 NoSQL
Redis为什么速度快:数据结构、存储及IO网络原理总结
Redis为什么速度快:数据结构、存储及IO网络原理总结
7 0
|
2天前
|
缓存 NoSQL Redis
redis管道操作(节省网络IO开销)
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。
5 1
|
4天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
13 3
|
6天前
|
网络协议 网络架构 数据格式
网络原理,网络通信以及网络协议
网络原理,网络通信以及网络协议
8 1
|
16天前
|
监控 网络协议 Java
Java一分钟之-Netty:高性能异步网络库
【6月更文挑战第11天】Netty是Java的高性能异步网络框架,基于NIO,以其高吞吐量、低延迟、灵活性和安全性受到青睐。常见问题包括内存泄漏、ChannelHandler滥用和异常处理不当。要规避这些问题,需正确释放ByteBuf,精简ChannelPipeline,妥善处理异常,并深入理解Netty原理。通过代码审查、遵循最佳实践和监控日志,可提升代码质量和性能。掌握Netty,打造高效网络服务。
20 2
|
27天前
|
编解码 前端开发 Java
Java网络API之Netty深度解析
Java网络API之Netty深度解析
25 0
|
30天前
|
网络协议 前端开发 网络安全
网络通信基础(网络通信基本概念+TCP/IP 模型)
网络通信基础(网络通信基本概念+TCP/IP 模型)
|
1月前
|
网络协议 网络架构 数据格式
网络初识:局域网广域网&网络通信基础
网络初识:局域网广域网&网络通信基础
34 5
|
1月前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
148 10
|
1月前
|
JSON 移动开发 网络协议
数据拆散与黏连:深入剖析Netty中的半包与粘包问题
数据拆散与黏连:深入剖析Netty中的半包与粘包问题
36 0