传统网络编程有什么问题

news2024/11/13 15:23:47

文章目录

  • 多线程版网络编程
    • 客户端
    • MyServerThread
    • 服务端
  • 线程池版的网络编程
    • 客户端
    • MyServerThread
    • 服务端
  • 总结

在这里插入图片描述


传统网络通信中的开发方式及问题

多线程版网络编程

在这里插入图片描述


下面先写一个多线程版网络编程的版本代码:

客户端

public static void main(String[] args) throws IOException {
    Socket socket;
    for (int i = 0; i < 5; i++) {
        socket = new Socket("127.0.0.1", 8899);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.write("hello , 我是客户端 " + i);
        printWriter.flush();
        socket.close();
    }
}

MyServerThread

public class MyServerThread implements Runnable {

    private Socket socket;

    public MyServerThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while( true ){
                String s = bufferedReader.readLine();
                if( s == null ){
                    break;
                }
                System.out.println(Thread.currentThread().getName() + "  "+s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null && !socket.isClosed()) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端

public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(8899);
    Socket socket = null;
    while (true){
        socket = serverSocket.accept();
        new Thread( new MyServerThread(socket) ).start();
    }
}

上面的代码存在的问题:

  1. 线程创建开销;
  2. 内存占用高,不能无限制的创建线程;
  3. CPU使用率高;

线程池版的网络编程

客户端

public static void main(String[] args) throws IOException {
    Socket socket;
    for (int i = 0; i < 30; i++) {
        socket = new Socket("127.0.0.1", 8899);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.write("hello , 我是客户端 " + i);
        printWriter.flush();
        socket.close();
    }
}

MyServerThread

public class MyServerThread implements Runnable {

    private Socket socket;
    
    public MyServerThread(Socket socket){
        this.socket = socket;
    }
    
    @Override
    public void run() {
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while( true ){
                String s = bufferedReader.readLine();
                if( s != null ){
                    System.out.println(Thread.currentThread().getName() + "  "+s);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null && !socket.isClosed()) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端

public class Server {

    static ThreadPoolExecutor threadPoolExecutor;
	//	线程池
    static {
        threadPoolExecutor = new ThreadPoolExecutor(5, 10, 120,
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20));
    }

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8899);
        Socket socket = null;
        while (true){
            socket = serverSocket.accept();
            //new Thread( new MyServerThread(socket) ).start();
            threadPoolExecutor.execute( new MyServerThread(socket) );
        }
    }
}

上面的代码是以线程池的方式解决之前的问题. 解决了线程开销问题和CPU占用率高的问题.

新的问题: 因为阻塞, 造成有限线程资源的浪费;


总结

与 Java NIO(New Input/Output)相比,传统网络编程(主要指的是基于阻塞 I/O 的模型)有一些明显的问题和局限性:

  1. 线程管理开销
    传统网络编程: 每个客户端连接通常会分配一个独立的线程。对于高并发场景,这种方法会导致线程数量急剧增加,从而增加线程上下文切换的开销和系统资源消耗。
    NIO: 通过使用选择器(Selectors)和非阻塞 I/O,可以用少量的线程处理大量的连接,显著降低了线程管理的开销。
  2. 阻塞 I/O
    传统网络编程: 使用阻塞 I/O 模型时,线程在等待数据读写时会被阻塞,这可能导致资源的浪费和响应时间的增加。
    NIO: 支持非阻塞 I/O 模型,使线程可以在等待 I/O 操作完成的同时执行其他任务,从而提高了效率。
  3. 扩展性
    传统网络编程: 处理大量并发连接时,系统可能会遇到性能瓶颈和资源限制,特别是在处理大量 I/O 操作时。
    NIO: 设计用于支持大规模的网络应用,可以高效地管理和调度大量的连接,具有更好的扩展性。
  4. 资源利用效率
    传统网络编程: 在处理高并发连接时,由于线程阻塞和切换的开销,系统资源(如 CPU 和内存)的利用效率较低。
    NIO: 通过减少线程的数量和避免线程阻塞,提高了系统资源的利用效率。
  5. 编程复杂性
    传统网络编程: 编写和管理基于阻塞 I/O 的网络代码相对简单,但在高并发场景下可能难以管理和扩展。
    NIO: 虽然提供了更高效的 I/O 模型,但其 API 更复杂,需要开发者理解选择器、通道和缓冲区的工作机制,增加了编程难度。
  6. 错误处理
    传统网络编程: 错误处理通常较为简单,但在处理大量并发连接时,可能会遇到性能瓶颈和资源耗尽问题。
    NIO: 错误处理可能更为复杂,需要处理各种异步事件和状态,增加了调试和维护的难度。
  7. 适应性
    传统网络编程: 在设计上可能不容易适应高并发和大规模数据传输的需求。
    NIO: 设计目标包括高并发和高性能,能够更好地适应现代网络应用的需求。

传统网络编程在处理高并发和大规模应用时通常面临性能瓶颈和资源管理问题,而 NIO 通过非阻塞 I/O 和选择器机制提供了更高效的解决方案。虽然 NIO 的 API 更复杂,但在高负载和高性能需求的场景下,它能够显著改善传统阻塞 I/O 的不足。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【推荐100个unity插件之27】推荐5种办法实现unity人物布料系统 衣服裙子飘动 头发飘动 胸部抖动 骨骼模拟 配件摆动 尾巴摆动

最终效果 文章目录 最终效果前言模型获取一、animation rigging 和 cloth布料模拟二、Unity-Chan!Model三、Dynamic Bone四、Magica Cloth 1五、Magica Cloth 21、介绍2、下载3、官方文档4、安装插件5、使用Animation Rigging插件可视化骨骼6、Magica Cloth介绍7、BoneCloth的使…

【采集软件】根据关键词批量采集小红薯,含笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解&#xff0c;我之前开发过2款软件&#xff1a; 【采集软件】用Python开发的小红薯搜索采集工具&#xff0c;支持多关键词同时&#xff01; 【采集软件】用Python开发的小红薯详情批量采集工具&#xff0c;含笔记正文、转评赞藏…

linux系统使用 docker 来部署运行 mysql8 并配置 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

【网格dp】力扣1594. 矩阵的最大非负积

给你一个大小为 m x n 的矩阵 grid 。最初&#xff0c;你位于左上角 (0, 0) &#xff0c;每一步&#xff0c;你可以在矩阵中 向右 或 向下 移动。 在从左上角 (0, 0) 开始到右下角 (m - 1, n - 1) 结束的所有路径中&#xff0c;找出具有 最大非负积 的路径。路径的积是沿路径访…

Java 入门指南:异常处理的实践规范

在 Java 中处理异常并不是一个简单的事情。需要花费很多时间来思考如何处理异常&#xff0c;包括需要处理哪些异常&#xff0c;怎样处理等等。 抛出或捕获异常的时候&#xff0c;有很多不同的情况需要考虑&#xff0c;而且大部分事情都是为了改善代码的可读性或者 API 的可用性…

捏蛋糕修牛蹄类型的解压视频素材去哪里找?

今天我们聊聊在哪里能找到制作捏蛋糕、修牛蹄等解压视频的素材。这类视频看起来心情就变好&#xff0c;特别解压。如果你也有兴趣制作这种视频&#xff0c;以下是一些优质的素材网站推荐&#xff0c;助你轻松找到所需素材。 蛙学网 开始我们的推荐列表是蛙学网。这是一个综合性…

npm国内源设置

一、背景 在国内使用npm时&#xff0c;由于网络问题&#xff0c;经常会遇到速度慢或无法访问的问题。为了提高效率&#xff0c;可以将npm的源设置为国内的镜像源。以下是一些常用的国内npm镜像源以及如何设置它们的方法。 二、国内可用源 2.1 淘宝npm源 https://registry.np…

SOLIDWORKS 2025全新功能解读:界面优化

准备好在SOLIDWORKS 2025中探索了吗?新版本&#xff0c;可帮助您简化和加速从概念到制造的产品开发流程&#xff0c;鑫辰科技带您抢先体验SOLIDWORKS 2025的亮点&#xff0c;深入了解新版本所增添的独特功能。 一&#xff1a;指定 Z-向上模板 在早期版本中&#xff0c;SOLID…

手算神经网络MAC和FLOP

在本文中&#xff0c;我们将深入探讨神经网络背景下的 MAC&#xff08;乘法累加运算&#xff09;和 FLOP&#xff08;浮点运算&#xff09;概念。通过学习如何使用笔和纸手动计算这些内容&#xff0c;你将对各种网络结构的计算复杂性和效率有基本的了解。 这是 colab 笔记本中…

使用 Python 和 SQL 自动将 ETL 传输到 SFTP 服务器

了解如何在 Windows 上自动执行从 PostgreSQL 数据库到远程服务器的日常数据传输过程 欢迎来到雲闪世界。将文件从一个位置传输到另一个位置的过程显然是自动化的完美选择。重复执行这项工作可能令人望而生畏&#xff0c;尤其是当您必须对几组数据执行整个 ETL&#xff08;提取…

神经网络模型剪枝快速指南

模型剪枝&#xff08;Model Pruning&#xff09;是指从深度学习神经网络模型中删除不重要的参数&#xff0c;以减小模型大小并实现更高效的模型推理。通常&#xff0c;只剪枝参数的权重&#xff0c;而不影响偏差。偏差的剪枝往往有更明显的缺点。 非结构化剪枝期间权重如何归零…

书生.浦江大模型实战训练营——(十)Lagent 自定义你的 Agent 智能体

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…

【9月持续更新】国内ChatGPT-4中文镜像网站整理~

以前我也是通过官网使用&#xff0c;但是经常被封号&#xff0c;就非常不方便&#xff0c;后来有朋友推荐国内工具&#xff0c;用了一阵之后&#xff0c;发现&#xff1a;稳定方便&#xff0c;用着也挺好的。 最新的 GPT-4o、4o mini&#xff0c;可搭配使用~ 1、 最新模型科普&…

遗传算法整合talib技术分析算子做因子挖掘,比如ADX, 阿隆指标等

“ 原创内容第631篇&#xff0c;专注量化投资、个人成长与财富自由” 七年实现财富自由 七年&#xff0c;经过十万小时刻意练习&#xff0c;足矣在任何领域成为专家。 七年&#xff0c;成为自己的财富管理专家。 七年&#xff0c;实现财富自由。 1512篇原创内容 公众号 星球…

怎样恢复微信聊天记录?4个巧妙方法,速来学习!

微信不仅是我们的通讯工具&#xff0c;更是情感的载体&#xff0c;每一句“早安”与“晚安”都藏着不为人知的温柔。但有时候这些珍贵的聊天记录却会离家出走。怎么恢复微信聊天记录&#xff1f;就成为我们需要解答的难题。 别担心&#xff0c;今天&#xff0c;小编我将化身为…

PostgresSQL--基于Kubernetes部署PostgresSQL

基于docker 拉取镜像&#xff0c;这个镜像是我自己的阿里云镜像&#xff0c;拉取的国外的镜像。 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest创建 dolphinscheduler 命名空间&#xff0c;本文命名空间是使用的dolphinscheduler 使用 kubectl…

基于元神操作系统编写(FPU)数学计算程序

1. 背景 数学计算已经成为计算机的主要工作之一&#xff0c;尤其是实数运算&#xff0c;在人工智能时代更是普遍存在&#xff0c;神经网络中的绝大部分参数都用的实数。 2. 方法 &#xff08;1&#xff09;FPU运算 计算机中的实数运算是通过数学协处理器FPU完成的&#xff…

黑神话悟空配置要求:CPU/内存/显卡/存储和系统最低限制

玩《黑神话&#xff1a;悟空》对电脑配置有什么要求&#xff1f;至少需要i5处理器、16G内存、GTX 1060显卡、130G空闲磁盘空间&#xff0c;没有高配电脑怎么办&#xff1f;码笔记整理详细配置如下&#xff1a; CPU处理器&#xff1a;64位处理器&#xff0c;CPU选择Intel Core …

数据防泄密知识集锦丨八个实用数据防泄露软件,你知道吗

数据已成为企业的核心资产。 然而&#xff0c;随着网络威胁的日益严峻&#xff0c;数据泄露事件频发&#xff0c;给企业带来了巨大的经济损失和声誉风险。 为了有效保护企业数据的安全性和保密性&#xff0c;各种数据防泄露软件应运而生。 本文将为您介绍八个实用的数据防泄露…

ROS机器人专用云台相机防抖摄像头

【告别模糊】机器人专用摄像头&#xff0c;为您的视觉算法保驾护航 产品概述 Autolabor C1专为机器人设计的高性能摄像头&#xff0c;即使在没有减震装置或不平坦的路面上&#xff0c;也能提供清晰稳定的图像。它拥有先进的主动式机械防抖和数字ISP防抖技术&#xff0c;图像效…