【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();
相关文章
|
8天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
12天前
|
存储 缓存 Linux
Linux IO的奥秘:深入探索数据流动的魔法
Linux I/O(输入/输出)系统是其核心功能之一,负责处理数据在系统内部及与外界之间的流动。为了优化这一流程,Linux进行了一系列努力和抽象化,以提高效率、灵活性和易用性。🚀
Linux IO的奥秘:深入探索数据流动的魔法
|
26天前
|
机器学习/深度学习 自然语言处理 数据处理
大模型开发:描述长短期记忆网络(LSTM)和它们在序列数据上的应用。
LSTM,一种RNN变体,设计用于解决RNN处理长期依赖的难题。其核心在于门控机制(输入、遗忘、输出门)和长期记忆单元(细胞状态),能有效捕捉序列数据的长期依赖,广泛应用于语言模型、机器翻译等领域。然而,LSTM也存在计算复杂度高、解释性差和数据依赖性强等问题,需要通过优化和增强策略来改进。
|
2天前
|
机器学习/深度学习 数据可视化 测试技术
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
|
3天前
|
机器学习/深度学习 API 算法框架/工具
R语言深度学习:用keras神经网络回归模型预测时间序列数据
R语言深度学习:用keras神经网络回归模型预测时间序列数据
14 0
|
3天前
|
机器学习/深度学习 数据采集 TensorFlow
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
23 0
|
3天前
|
存储 算法 前端开发
R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据
R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据
26 0
|
3天前
|
机器学习/深度学习 数据可视化 网络架构
matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
|
4天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android's AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
5 0
|
4天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
5 0