`
Donald_Draper
  • 浏览: 950840 次
社区版块
存档分类
最新评论

AbstractSelectableChannel定义

    博客分类:
  • NIO
 
阅读更多
Channel接口定义:http://donald-draper.iteye.com/blog/2369111
AbstractInterruptibleChannel接口定义:http://donald-draper.iteye.com/blog/2369238
SelectableChannel接口定义:http://donald-draper.iteye.com/blog/2369317
SelectionKey定义:http://donald-draper.iteye.com/blog/2369499
SelectorProvider定义:http://donald-draper.iteye.com/blog/2369615
前面我们看了可选择通道接口,选择key和通道、选择器提供服务者的相关定义,今天来看一下可选择通的基础实现AbstractSelectableChannel。
package java.nio.channels.spi;
import java.io.IOException;
import java.nio.channels.*;
/**
 * Base implementation class for selectable channels.
 *AbstractSelectableChannel可选择通道的基础实现类。
 *  This class defines methods that handle the mechanics of channel
 * registration, deregistration, and closing.  It maintains the current
 * blocking mode of this channel as well as its current set of selection keys.
 * It performs all of the synchronization required to implement the {@link
 * java.nio.channels.SelectableChannel} specification.  Implementations of the
 * abstract protected methods defined in this class need not synchronize
 * against other threads that might be engaged in the same operations.  

 *AbstractSelectableChannel提供通道的注册,反注册和关闭机制的实现。维护者与选择器key集合
 中通道对应的选择key相同的阻塞模式。实现了可选择通道需要实现所有同步操作。 AbstractSelectableChannel
 中所有的protect抽象方法,不需要同步,因为这些方法与其他线程相同的操作没有冲突。
 *
 * @author Mark Reinhold
 * @author Mike McCloskey
 * @author JSR-51 Expert Group
 * @since 1.4
 */

public abstract class AbstractSelectableChannel
    extends SelectableChannel
{

    // The provider that created this channel,通道提供者
    private final SelectorProvider provider;

    // Keys that have been created by registering this channel with selectors.
    // They are saved because if this channel is closed the keys must be
    // deregistered.  Protected by keyLock.
    //通道注册到选择器器的所有选择key。之所以保存的原因,是为了在通道关闭时,反注册通道的选择key。
    //通过keyLock保证选择key集合的线程安全访问
    private SelectionKey[] keys = null;
    private int keyCount = 0;//与通道相关选择key的数量

    // Lock for key set and count 选择key数组保护锁
    private final Object keyLock = new Object();

    // Lock for registration and configureBlocking operations
    //注册和阻塞配置同步锁
    private final Object regLock = new Object();

    // Blocking mode, protected by regLock,默认为阻塞模式
    //只有非阻塞模式的通道,才可以注册到选择器
    boolean blocking = true;

    /**
     * Initializes a new instance of this class.
     根据选择器服务提供者,构建AbstractSelectableChannel
     */
    protected AbstractSelectableChannel(SelectorProvider provider) {
        this.provider = provider;
    }

    /**
     * Returns the provider that created this channel.
     *返回创建通道的选择器提供者。
     * @return  The provider that created this channel
     */
    public final SelectorProvider provider() {
        return provider;
    }


    // -- Utility methods for the key set --
    //添加选择key
    private void addKey(SelectionKey k) {
        synchronized (keyLock) {
            int i = 0;
            if ((keys != null) && (keyCount < keys.length)) {
	        //如果选择key数组已经创建,且数组未满,遍历数组中第一个为null的选择key,
		//存在,记录位置
                // Find empty element of key array
                for (i = 0; i < keys.length; i++)
                    if (keys[i] == null)
                        break;
            } else if (keys == null) {
	        //如果选择key数组为创建,则创建选择key数组,默认容量为3,(读写连接事件/接受连接事件)
                keys =  new SelectionKey[3];
            } else {
	        //如果选择key数组已满,则扩容为原来容量的2倍
                // Grow key array
                int n = keys.length * 2;
                SelectionKey[] ks =  new SelectionKey[n];
                for (i = 0; i < keys.length; i++)
                    ks[i] = keys[i];
                keys = ks;
                i = keyCount;
            }
            keys[i] = k;
            keyCount++;
        }
    }
    //判断通道是否与指定的选择器是否有关联,
    //换一种说法为,通道是否注册到选择器
    private SelectionKey findKey(Selector sel) {
        synchronized (keyLock) {
            if (keys == null)
                return null;
	   //遍历通道选择key数组,匹配选择key的选择器
            for (int i = 0; i < keys.length; i++)
                if ((keys[i] != null) && (keys[i].selector() == sel))
                    return keys[i];
            return null;
        }
    }
    //移除通道的指定选择key
    void removeKey(SelectionKey k) {                    // package-private
        synchronized (keyLock) {
	    //遍历通道选择key数组,匹配选择key,相等则置null
            for (int i = 0; i < keys.length; i++)
                if (keys[i] == k) {
                    keys[i] = null;
                    keyCount--;
                }
	    //设置选择key状态为无效
            ((AbstractSelectionKey)k).invalidate();
        }
    }
   //判断通道选择key是否存在有效的,即是否注册到通道
    private boolean haveValidKeys() {
        synchronized (keyLock) {
            if (keyCount == 0)
                return false;
	   //遍历通道选择key数组,判断选择key是否有效,存在一个有效,则返回true
            for (int i = 0; i < keys.length; i++) {
                if ((keys[i] != null) && keys[i].isValid())
                    return true;
            }
            return false;
        }
    }


    // -- Registration --
    //是否注册到通道,选择key数组实际数量不为0,则已注册
    public final boolean isRegistered() {
        synchronized (keyLock) {
            return keyCount != 0;
        }
    }
    //通道注册到指定选择器的选择key
    public final SelectionKey keyFor(Selector sel) {
        return findKey(sel);
    }

    /**
     * Registers this channel with the given selector, returning a selection key.
     *注册通道到选择器,返回通道与选择器的映射选择key
     *   This method first verifies that this channel is open and that the
     * given initial interest set is valid.
     *方法首先验证通道是否打开,关注的操作事件是否有效
     * <p> If this channel is already registered with the given selector then
     * the selection key representing that registration is returned after
     * setting its interest set to the given value.
     *如果通道已经注册到选择器,则更新兴趣操作事件集,和附件对象
     * <p> Otherwise this channel has not yet been registered with the given
     * selector, so the {@link AbstractSelector#register register} method of
     * the selector is invoked while holding the appropriate locks.  The
     * resulting key is added to this channel's key set before being returned.
     如果还没有注册到选择器,则注册通道到选择器,并将返回的选择key添加到通道
     的选择key数组中。
     * 

     *
     * @throws  ClosedSelectorException {@inheritDoc}
     *
     * @throws  IllegalBlockingModeException {@inheritDoc}
     *
     * @throws  IllegalSelectorException {@inheritDoc}
     *
     * @throws  CancelledKeyException {@inheritDoc}
     *
     * @throws  IllegalArgumentException {@inheritDoc}
     */
    public final SelectionKey register(Selector sel, int ops,
                                       Object att)
        throws ClosedChannelException
    {
        if (!isOpen())
	    //通道已经关闭,则抛出ClosedChannelException
            throw new ClosedChannelException();
        if ((ops & ~validOps()) != 0)
	    //如果注册的操作事件非通道所支持的操作事件,则抛出IllegalArgumentException
            throw new IllegalArgumentException();
        synchronized (regLock) {
            if (blocking)
	        //如果通道是阻塞模式,则抛出IllegalBlockingModeException
                throw new IllegalBlockingModeException();
            SelectionKey k = findKey(sel);
            if (k != null) {
	        //通道已经注册到选择器,更新兴趣操作事件集和附加对象
                k.interestOps(ops);
                k.attach(att);
            }
            if (k == null) {
                // New registration
		//否则,注册通道到选择器,具体注册流程,我们在以后具体详说
                k = ((AbstractSelector)sel).register(this, ops, att);
		//将注册返回的选择key,添加到通道的选择key集合中
                addKey(k);
            }
            return k;
        }
    }


    // -- Closing --

    /**
     * Closes this channel.
     *
     *  This method, which is specified in the {@link
     * AbstractInterruptibleChannel} class and is invoked by the {@link
     * java.nio.channels.Channel#close close} method, in turn invokes the
     * {@link #implCloseSelectableChannel implCloseSelectableChannel} method in
     * order to perform the actual work of closing this channel.  It then
     * cancels all of this channel's keys.  

     */
    protected final void implCloseChannel() throws IOException {
        //关闭可选择通达
        implCloseSelectableChannel();
        synchronized (keyLock) {
            int count = (keys == null) ? 0 : keys.length;
	    //遍历通道的选择key数组,取消选择key
            for (int i = 0; i < count; i++) {
                SelectionKey k = keys[i];
                if (k != null)
                    k.cancel();
            }
        }
    }

    /**
     * Closes this selectable channel.
     *关闭可选择通道
     *  This method is invoked by the {@link java.nio.channels.Channel#close
     * close} method in order to perform the actual work of closing the
     * channel.  This method is only invoked if the channel has not yet been
     * closed, and it is never invoked more than once.
     *这个方法在通道关闭方法中执行实际的通道关闭工作,在通道还没有完全关闭时,调用,
     最多调用一次。
     * <p> An implementation of this method must arrange for any other thread
     * that is blocked in an I/O operation upon this channel to return
     * immediately, either by throwing an exception or by returning normally.
     此方法的实现必须安排其他阻塞在通道IO操作的线程立刻返回,或抛出一个异常,或正常返回。
     * 

     */
    protected abstract void implCloseSelectableChannel() throws IOException;


    // -- Blocking --
    //判断阻塞模式
    public final boolean isBlocking() {
        synchronized (regLock) {
            return blocking;
        }
    }
    //获取阻塞锁,即注册锁regLock
    public final Object blockingLock() {
        return regLock;
    }

    /**
     * Adjusts this channel's blocking mode.
     *
     *  If the given blocking mode is different from the current blocking
     * mode then this method invokes the {@link #implConfigureBlocking
     * implConfigureBlocking} method, while holding the appropriate locks, in
     * order to change the mode.  

     */
    public final SelectableChannel configureBlocking(boolean block)
        throws IOException
    {
        if (!isOpen())
	    //如果通道关闭,则抛出ClosedChannelException
            throw new ClosedChannelException();
        synchronized (regLock) {
            if (blocking == block)
	        //通道阻塞模式相同,则直接返回
                return this;
            if (block && haveValidKeys())
	       //已注册到通道,只能是非阻塞模式,配置阻塞模式,抛出IllegalBlockingModeException
                throw new IllegalBlockingModeException();
            implConfigureBlocking(block);
            blocking = block;
        }
        return this;
    }

    /**
     * Adjusts this channel's blocking mode.
     *调整通道阻塞模式
     *  This method is invoked by the {@link #configureBlocking
     * configureBlocking} method in order to perform the actual work of
     * changing the blocking mode.  This method is only invoked if the new mode
     * is different from the current mode.  

     *此方方法在#configureBlocking方法中调用,主要执行实际的阻塞模式切换工作。
     此方只有在配置的阻塞模式与当前阻塞模式不同时,才会被调用。
     * @throws IOException
     *         If an I/O error occurs
     */
    protected abstract void implConfigureBlocking(boolean block)
        throws IOException;

}

总结:
AbstractSelectableChannel有一个SelectorProvider类型的变量provider,主要是为创建通道而服务。一个选择key数组keys,保存与通道相关的选择key,一个key计数器keyCount,记录当前通道注册到选择器,生成的选择key。一个布尔blocking记录当前通道的阻塞模式。一个keyLock拥有控制选择key数据的线程安全访问。同时还有一个regLock控制通道注册选择器和配置通道阻塞模式的线程安全访问。提供了选择key集合keys的添加和移除,判断通道是否注册到选择器,及获取注册到选择器的选择key。注册通道到选择器过程为:首先验证通道是否打开,关注的操作事件是否有效,如果通道打开且事件有效,判断通道是注册到选择器,如果通道已经注册到选择器,则更新兴趣操作事件集,和附件对象,否则调用选择器的注册方法,并将返回的选择key添加到通道选择key集合。关闭通道所做的工作主要是,遍历通道的选择key数组,取消选择key。
0
0
分享到:
评论

相关推荐

    mina:Java Nio Apache Mina Java Nio

    java-nio java-nio ...AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, Socke

    node-v12.20.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Springboot+Vue的乡政府管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    一名合格的程序猿修炼手册.md

    一名合格的程序猿修炼手册.

    5MHz 函数发生器使用说明书

    5MHz 函数发生器使用说明书

    99- 矿山工业互联网平台解决方案.pptx

    99- 矿山工业互联网平台解决方案.pptx

    基于Python大学生社会实践申报系统的设计与实现带vue前后端分离毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    工厂工资明细表Excel模版

    基于提供的字段介绍,我们可以设计一个基础的工厂工资明细表Excel模板结构如下: | 序号 | 姓名 | 工种 | 工作天数 | 工时费/天 | 小计(正常工资) | 加班时间 | 加班费率/小时 | 小计(加班工资) | 预借 | 合计(实发工资) | 签字 | 备注 | | ---- | ---- | ---- | -------- | ---------- | -------------- | -------- | -------------- | --------------- | ---- | -------------- | ---- | ---- | | 1 | | | | | | | | | | | | | | 2 | | | | | =D2*C2

    供应链管理 高成本、高库存、重资产的解决方案.rar

    随着市场竞争的不断加剧和客户需求的多样化,传统的供应链管理模式面临着高成本、高库存和重资产等一系列挑战。为了有效应对这些挑战,企业亟需通过数字化转型来重塑供应链管理,实现效率提升和成本降低。本资料《供应链管理:高成本、高库存、重资产的解决方案》提供了针对这些问题的综合性数字化解决方案。在这份精品资料中,读者将了解到如何利用先进的信息技术手段,如大数据、云计算、物联网(IoT)和人工智能(AI),对供应链进行优化。通过实时数据分析,企业能够精准预测市场需求,从而减少过剩库存,降低仓储成本。同时,智能化的供应链协同平台可以加强供应商与制造商之间的合作,提高响应速度和灵活性,缩短产品交付周期。此外,资料还深入探讨了如何通过数字技术实现供应链的可视化管理,使企业能够全面掌握供应链的每一个环节,及时发现并解决问题,避免成本浪费。通过采用轻资产运营模式,企业能够减轻固定资产负担,提高资本使用效率。最终,这份资料不仅为企业提供了一套完整的供应链数字化转型路径,还结合具体案例分析,展示了数字化转型如何在实际操作中带来显著成效,帮助企业在激烈的市场竞争中保持领先地位。重新回答||

    五相感应电机矢量控制模型MATLAB

    适合相关科研人员,新手借鉴啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

    node-v10.14.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于STM32F103C8单片机-FLASH读写程序KEIL工程源码.zip

    STM32学习软件编程资料,STM32F103C8单片机经典外设应用设计实例软件源代码,KEIL工程文件,可供学习参考。

    node-v12.22.8-sunos-x64.tar_3.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.16.2-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    菜鸟自制流密码.docx

    菜鸟自制流密码.docx

    基于大数据的房产估价.doc

    基于大数据的房产估价 基于大数据的房产估价是一种利用海量数据和分析技术来评估房地产价值的方法。它通过收集、整合和分析各种与房地产相关的数据,以提供更加准确、全面的房产估价服务。 首先,大数据在房产估价中的应用主要体现在数据收集和处理上。这些数据可能包括不同时间点的房产属性、成交量、成交额、成交时长等,以及消费者线上行为数据和市场交易数据等。这些数据可以来自于多个渠道,如政府部门、房地产机构、互联网平台等。通过对这些数据的收集、清洗、整合和分析,可以更加准确地判断房地产市场的现状和趋势,为房产估价提供有力的数据支持。 其次,基于大数据的房产估价方法还可以结合地理信息系统(GIS)和其他技术工具,对房地产价格进行精细化分析。例如,可以利用GIS系统判断各类城市生活配套设施对房地产价格影响的权重,或者结合消费者行为数据和交易数据,分析目标消费者的核心需求和迫切程度,从而更准确地判断房地产项目的可行性和市场潜力。 此外,基于大数据的房产估价还可以利用机器学习、人工智能等先进技术,构建预测模型,对房地产市场的未来发展进行预测和研判。这些模型可以根据历史数据和趋势,分析各种因素对房地产价格的

    node-v11.6.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    5G网优认证练习题题库.xlsx

    5G通信、网络优化与通信建设

    绘画学习平台微信小程序设计+ssm后端毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    抛光机-零件图-机械工程图-机械三维3D建模图打包下载.zip

    抛光机_零件图_机械工程图_机械三维3D建模图打包下载.zip

Global site tag (gtag.js) - Google Analytics