- 浏览: 951494 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
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,一直不知道什么意思,再往下分析之前,我们先看一下SelectorProvider的定义,以便后面更好的理解通道和选择器。
总结:
SelectorProvider就是为了创建DatagramChannel,Pipe,Selector,ServerSocketChannel,SocketChannel,System.inheritedChannel()而服务的,在相应的通道和选择器的open方法中调用系统默认的SelectorProvider相关的open*方法,创建相应的通道和选择器。SelectorProvider的provider方法主要是实例化SelectorProvider,过程为:判断java.nio.channels.spi.SelectorProvider系统属性是否被定义为一个具体的SelectorProvider实现类的唯一类名,是则加载此类,实例化,如果加载实例化失败,返回一个错误。如果无没有选择器提供者属性配置,则在SelectorProvider的实现且对系统类加载器可见Jar包中,的资源文件META-INF/services的目录下,提供了provider-configuration文件java.nio.channels.spi.SelectorProvider,则文件的第一个class类将会被加载和实例化,如果加载实例化失败,返回一个错误。上两步失败,则加载系统默认的选择器提供者。inheritedChannel方法主要是更具系统网络服务,更具具体的网络请求,创建不同的可继承实例,如果继承通道表示一个面向流的连接Socket,则SocketChannel将会被返回。SocketChannel初始化为阻塞模式,绑定一个socket地址,连接一个peer。如果继承通道表示一个面向流的监听socket,则ServerSocketChannel将会被返回。ServerSocketChannel初始化为阻塞模式,绑定一个socket地址。如果继承的通道是一个面向报文的Socket,则DatagramChannel将会被返回,初始化为阻塞模式,绑定一个socket地址。
下面我们再来看一下SelectorProvider的provider方法系统默认的SelectorProvider:
//SelectorProvider
来看默认的DefaultSelectorProvider
//DefaultSelectorProvider
再来看WindowsSelectorProvider
//WindowsSelectorProvider
再来看SelectorProviderImpl
//SelectorProviderImpl
从上面可以看出,WindowsSelectorProvider为系统默认选择器提供者,默认选择器为WindowsSelectorImpl,SelectorProviderImpl为默认的通道提供者,各类通道和管道的默认实现为:DatagramChannelImpl,ServerSocketChannelImpl,SocketChannelImpl,
PipeImpl。具体的通道,管道和选择器的实现,我们在相关文章会再次讲解。
我们来简单SocketChannel的open方法:
//SocketChannel
有了上面的分析,这个open应该很好理解。其他通道,选择器打开操作的思路是相同的。
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,一直不知道什么意思,再往下分析之前,我们先看一下SelectorProvider的定义,以便后面更好的理解通道和选择器。
package java.nio.channels.spi; import java.io.IOException; import java.net.ProtocolFamily; import java.nio.channels.*; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Iterator; import java.util.ServiceLoader; import java.util.ServiceConfigurationError; import sun.security.action.GetPropertyAction; /** * Service-provider class for selectors and selectable channels. *SelectorProvider主要是为创建选择器和可选择通道而服务的。 * A selector provider is a concrete subclass of this class that has a * zero-argument constructor and implements the abstract methods specified * below. A given invocation of the Java virtual machine maintains a single * system-wide default provider instance, which is returned by the {@link * #provider() provider} method. The first invocation of that method will locate * the default provider as specified below. *SelectorProvider的子类有一个无参的构造器,并实现了一些特殊的抽象方法,如下: 通过#provider调用java虚拟机维护一个系统默认的SelectorProvider实例。 * * methods of the {@link java.nio.channels.DatagramChannel#open * DatagramChannel}, {@link java.nio.channels.Pipe#open Pipe}, {@link * java.nio.channels.Selector#open Selector}, {@link * java.nio.channels.ServerSocketChannel#open ServerSocketChannel}, and {@link * java.nio.channels.SocketChannel#open SocketChannel} classes. It is also * used by the {@link java.lang.System#inheritedChannel System.inheritedChannel()} * method. A program may make use of a provider other than the default provider * by instantiating that provider and then directly invoking the <tt>open</tt> * methods defined in this class. * 系统默认的SelectorProvider被用于DatagramChannel,Pipe,Selector,ServerSocketChannel, SocketChannel,System.inheritedChannel()的open方法中,用于创建相应的通道和选择器。 * <p> All of the methods in this class are safe for use by multiple concurrent * threads. *所有的方法可以并发安全访问。 * * @author Mark Reinhold * @author JSR-51 Expert Group * @since 1.4 */ public abstract class SelectorProvider { private static final Object lock = new Object(); private static SelectorProvider provider = null; /** * Initializes a new instance of this class. *初始化SelectorProvider实例,如果不为null,检查运行时权限 * @throws SecurityException * If a security manager has been installed and it denies * {@link RuntimePermission}<tt>("selectorProvider")</tt> */ protected SelectorProvider() { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new RuntimePermission("selectorProvider")); } //根据系统属性java.nio.channels.spi.SelectorProvider配置 //加载SelectorProvider实例 private static boolean loadProviderFromProperty() { //获取系统属性java.nio.channels.spi.SelectorProvider配置 String cn = System.getProperty("java.nio.channels.spi.SelectorProvider"); if (cn == null) return false; try { Class<?> c = Class.forName(cn, true, ClassLoader.getSystemClassLoader()); //加载SelectorProvider实例 provider = (SelectorProvider)c.newInstance(); return true; } catch (ClassNotFoundException x) { throw new ServiceConfigurationError(null, x); } catch (IllegalAccessException x) { throw new ServiceConfigurationError(null, x); } catch (InstantiationException x) { throw new ServiceConfigurationError(null, x); } catch (SecurityException x) { throw new ServiceConfigurationError(null, x); } } //获取系统加载路径下的所有SelectorProvider实现类的实现,以最后一个作为SelectorProvider private static boolean loadProviderAsService() { ServiceLoader<SelectorProvider> sl = ServiceLoader.load(SelectorProvider.class, ClassLoader.getSystemClassLoader()); Iterator<SelectorProvider> i = sl.iterator(); for (;;) { try { if (!i.hasNext()) return false; provider = i.next(); return true; } catch (ServiceConfigurationError sce) { if (sce.getCause() instanceof SecurityException) { // Ignore the security exception, try the next provider continue; } throw sce; } } } /** * Returns the system-wide default selector provider for this invocation of * the Java virtual machine. *返回JVM默认的SelectorProvider * The first invocation of this method locates the default provider * object as follows: *首先调用本地默认的SelectorProvider,过程如下: * [list=1] * * <li> If the system property * <tt>java.nio.channels.spi.SelectorProvider</tt> is defined then it is * taken to be the fully-qualified name of a concrete provider class. * The class is loaded and instantiated; if this process fails then an * unspecified error is thrown. </li> * 如果java.nio.channels.spi.SelectorProvider系统属性被定义为一个具体的SelectorProvider 实现类的唯一类名,则此类将会被加载,实例化,如果加载实例化失败,返回一个错误。 * <li> If a provider class has been installed in a jar file that is * visible to the system class loader, and that jar file contains a * provider-configuration file named * <tt>java.nio.channels.spi.SelectorProvider</tt> in the resource * directory <tt>META-INF/services</tt>, then the first class name * specified in that file is taken. The class is loaded and * instantiated; if this process fails then an unspecified error is * thrown. </li> *如果SelectorProvider的实现在Jar包中,且对系统类加载器可见,且Jar在资源文件META-INF/services 的目录下,提供了provider-configuration文件java.nio.channels.spi.SelectorProvider,则文件的 第一个class类将会被加载和实例化,如果加载实例化失败,返回一个错误。 * <li> Finally, if no provider has been specified by any of the above * means then the system-default provider class is instantiated and the * result is returned. </li> * 如果上面两步没有发现或实例化SelectorProvider成功,则系统默认的SelectorProvider类,将会实例化。 * [/list] * * Subsequent invocations of this method return the provider that was * returned by the first invocation. * * @return The system-wide default selector provider */ public static SelectorProvider provider() { synchronized (lock) { if (provider != null) return provider; //在与当前线程相同访问控制权限的环境中,加载SelectorProvider实例 return AccessController.doPrivileged( new PrivilegedAction<SelectorProvider>() { public SelectorProvider run() { if (loadProviderFromProperty()) //获取系统配置的SelectorProvider return provider; if (loadProviderAsService()) //获取类加载路径下的SelectorProvider return provider; //加载默认的SelectorProvider provider = sun.nio.ch.DefaultSelectorProvider.create(); return provider; } }); } } /** * Opens a datagram channel. </p> *打开一个DatagramChannel * @return The new channel */ public abstract DatagramChannel openDatagramChannel() throws IOException; /** * Opens a datagram channel. *根据协议,打开一个DatagramChannel * @param family * The protocol family * * @return A new datagram channel * * @throws UnsupportedOperationException * If the specified protocol family is not supported * @throws IOException * If an I/O error occurs * * @since 1.7 */ public abstract DatagramChannel openDatagramChannel(ProtocolFamily family) throws IOException; /** * Opens a pipe. </p> * 打开一个Pipe * @return The new pipe */ public abstract Pipe openPipe() throws IOException; /** * Opens a selector. </p> *打开一个Selector * @return The new selector */ public abstract AbstractSelector openSelector() throws IOException; /** * Opens a server-socket channel. </p> *打开一个ServerSocketChannel * @return The new channel */ public abstract ServerSocketChannel openServerSocketChannel() throws IOException; /** * Opens a socket channel. </p> *打开一个SocketChannel * @return The new channel */ public abstract SocketChannel openSocketChannel() throws IOException; /** * Returns the channel inherited from the entity that created this * Java virtual machine. *返回继承虚拟机创建实例的通道 * On many operating systems a process, such as a Java virtual * machine, can be started in a manner that allows the process to * inherit a channel from the entity that created the process. The * manner in which this is done is system dependent, as are the * possible entities to which the channel may be connected. For example, * on UNIX systems, the Internet services daemon (<i>inetd</i>) is used to * start programs to service requests when a request arrives on an * associated network port. In this example, the process that is started, * inherits a channel representing a network socket. *在许多操作系统中,一个进程允许从创建此进程的实体继承一个通道。这种方式依赖 系统实现,也许实体到已连接的通道。在UNIX系统中,当在网络端口中,如果一个请求到达, 后台网络服务将会启动程序处理请求。在这个例子中,进程被启动,继承的通道表示一个网络socket。 * <p> In cases where the inherited channel represents a network socket * then the {@link java.nio.channels.Channel Channel} type returned * by this method is determined as follows: *此方法返回的具体通道的过程如下: * [list] * * <li><p> If the inherited channel represents a stream-oriented connected * socket then a {@link java.nio.channels.SocketChannel SocketChannel} is * returned. The socket channel is, at least initially, in blocking * mode, bound to a socket address, and connected to a peer. * </li> *如果继承通道表示一个面向流的连接Socket,则SocketChannel将会被返回。SocketChannel 初始化为阻塞模式,绑定一个socket地址,连接一个peer * <li> If the inherited channel represents a stream-oriented listening * socket then a {@link java.nio.channels.ServerSocketChannel * ServerSocketChannel} is returned. The server-socket channel is, at * least initially, in blocking mode, and bound to a socket address. * </li> *如果继承通道表示一个面向流的监听socket,则ServerSocketChannel将会被返回。 ServerSocketChannel初始化为阻塞模式,绑定一个socket地址。 * <li> If the inherited channel is a datagram-oriented socket * then a {@link java.nio.channels.DatagramChannel DatagramChannel} is * returned. The datagram channel is, at least initially, in blocking * mode, and bound to a socket address. * </li> *如果继承的通道是一个面向报文的Socket,则DatagramChannel将会被返回, 初始化为阻塞模式,绑定一个socket地址。 * [/list] * * In addition to the network-oriented channels described, this method * may return other kinds of channels in the future. *目前就这三种继承通道,将会可能种类更多。 * <p> The first invocation of this method creates the channel that is * returned. Subsequent invocations of this method return the same * channel. *第一次调用,则创建一个通道,后续的调用将会返回同一个通道 * @return The inherited channel, if any, otherwise <tt>null</tt>. * * @throws IOException * If an I/O error occurs * * @throws SecurityException * If a security manager has been installed and it denies * {@link RuntimePermission}<tt>("inheritedChannel")</tt> * * @since 1.5 */ public Channel inheritedChannel() throws IOException { return null; } }
总结:
SelectorProvider就是为了创建DatagramChannel,Pipe,Selector,ServerSocketChannel,SocketChannel,System.inheritedChannel()而服务的,在相应的通道和选择器的open方法中调用系统默认的SelectorProvider相关的open*方法,创建相应的通道和选择器。SelectorProvider的provider方法主要是实例化SelectorProvider,过程为:判断java.nio.channels.spi.SelectorProvider系统属性是否被定义为一个具体的SelectorProvider实现类的唯一类名,是则加载此类,实例化,如果加载实例化失败,返回一个错误。如果无没有选择器提供者属性配置,则在SelectorProvider的实现且对系统类加载器可见Jar包中,的资源文件META-INF/services的目录下,提供了provider-configuration文件java.nio.channels.spi.SelectorProvider,则文件的第一个class类将会被加载和实例化,如果加载实例化失败,返回一个错误。上两步失败,则加载系统默认的选择器提供者。inheritedChannel方法主要是更具系统网络服务,更具具体的网络请求,创建不同的可继承实例,如果继承通道表示一个面向流的连接Socket,则SocketChannel将会被返回。SocketChannel初始化为阻塞模式,绑定一个socket地址,连接一个peer。如果继承通道表示一个面向流的监听socket,则ServerSocketChannel将会被返回。ServerSocketChannel初始化为阻塞模式,绑定一个socket地址。如果继承的通道是一个面向报文的Socket,则DatagramChannel将会被返回,初始化为阻塞模式,绑定一个socket地址。
下面我们再来看一下SelectorProvider的provider方法系统默认的SelectorProvider:
//SelectorProvider
public static SelectorProvider provider() { synchronized (lock) { if (provider != null) return provider; //在与当前线程相同访问控制权限的环境中,加载SelectorProvider实例 return AccessController.doPrivileged( new PrivilegedAction<SelectorProvider>() { public SelectorProvider run() { if (loadProviderFromProperty()) //获取系统配置的SelectorProvider return provider; if (loadProviderAsService()) //获取类加载路径下的SelectorProvider return provider; //加载默认的SelectorProvider provider = sun.nio.ch.DefaultSelectorProvider.create(); return provider; } }); } }
来看默认的DefaultSelectorProvider
//DefaultSelectorProvider
package sun.nio.ch; import java.nio.channels.spi.SelectorProvider; // Referenced classes of package sun.nio.ch: // WindowsSelectorProvider public class DefaultSelectorProvider { private DefaultSelectorProvider() { } public static SelectorProvider create() { //默认的WindowsSelectorProvider return new WindowsSelectorProvider(); } }
再来看WindowsSelectorProvider
//WindowsSelectorProvider
package sun.nio.ch; import java.io.IOException; import java.nio.channels.spi.AbstractSelector; // Referenced classes of package sun.nio.ch: // SelectorProviderImpl, WindowsSelectorImpl public class WindowsSelectorProvider extends SelectorProviderImpl { public WindowsSelectorProvider() { } public AbstractSelector openSelector() throws IOException { //默认的选择器实现类 return new WindowsSelectorImpl(this); } }
再来看SelectorProviderImpl
//SelectorProviderImpl
package sun.nio.ch; import java.io.IOException; import java.net.ProtocolFamily; import java.nio.channels.*; import java.nio.channels.spi.AbstractSelector; import java.nio.channels.spi.SelectorProvider; // Referenced classes of package sun.nio.ch: // DatagramChannelImpl, PipeImpl, ServerSocketChannelImpl, SocketChannelImpl public abstract class SelectorProviderImpl extends SelectorProvider { public SelectorProviderImpl() { } //打开一个报文通道 public DatagramChannel openDatagramChannel() throws IOException { return new DatagramChannelImpl(this); } //根据协议,打开一个报文通道 public DatagramChannel openDatagramChannel(ProtocolFamily protocolfamily) throws IOException { return new DatagramChannelImpl(this, protocolfamily); } //打开一个管道 public Pipe openPipe() throws IOException { return new PipeImpl(this); } //打开一个选择器,待子类扩展 public abstract AbstractSelector openSelector() throws IOException; //打开一个监听socket通道 public ServerSocketChannel openServerSocketChannel() throws IOException { return new ServerSocketChannelImpl(this); } //打开一个socket通道(连接) public SocketChannel openSocketChannel() throws IOException { return new SocketChannelImpl(this); } }
从上面可以看出,WindowsSelectorProvider为系统默认选择器提供者,默认选择器为WindowsSelectorImpl,SelectorProviderImpl为默认的通道提供者,各类通道和管道的默认实现为:DatagramChannelImpl,ServerSocketChannelImpl,SocketChannelImpl,
PipeImpl。具体的通道,管道和选择器的实现,我们在相关文章会再次讲解。
我们来简单SocketChannel的open方法:
//SocketChannel
public abstract class ServerSocketChannel extends AbstractSelectableChannel implements NetworkChannel { public static ServerSocketChannel open() throws IOException { return SelectorProvider.provider().openServerSocketChannel(); } }
有了上面的分析,这个open应该很好理解。其他通道,选择器打开操作的思路是相同的。
发表评论
-
文件通道解析二(文件锁,关闭通道)
2017-05-16 23:17 995文件通道解析一(读写操作,通道数据传输等):http://do ... -
文件通道解析一(读写操作,通道数据传输等)
2017-05-16 10:04 1102Reference定义(PhantomRefere ... -
文件通道创建方式综述
2017-05-15 17:39 936Reference定义(PhantomReference,Cl ... -
文件读写方式简单综述后续(文件,流构造)
2017-05-14 23:04 1402Java Socket通信实例:http://donald-d ... -
文件读写方式简单综述
2017-05-14 11:13 1072Java Socket通信实例:http://donald-d ... -
FileChanne定义
2017-05-12 23:28 871文件读写方式简单综述:http://donald-draper ... -
SeekableByteChannel接口定义
2017-05-11 08:43 1123ByteChannel,分散聚集通道接口的定义(SocketC ... -
FileChannel示例
2017-05-11 08:37 908前面我们看过socket通道,datagram通道,以管道Pi ... -
PipeImpl解析
2017-05-11 08:41 840ServerSocketChannel定义:http://do ... -
Pipe定义
2017-05-10 09:07 843Channel接口定义:http://donald-drape ... -
NIO-Pipe示例
2017-05-10 08:47 849PipeImpl解析:http://donald-draper ... -
DatagramChannelImpl 解析四(地址绑定,关闭通道等)
2017-05-10 08:27 693DatagramChannelImpl 解析一(初始化):ht ... -
DatagramChannelImpl 解析三(多播)
2017-05-10 08:20 1693DatagramChannelImpl 解析一(初始化):ht ... -
NIO-UDP实例
2017-05-09 12:32 1517DatagramChannelImpl 解析一(初始化):ht ... -
DatagramChannelImpl 解析二(报文发送与接收)
2017-05-09 09:03 1343DatagramChannelImpl 解析一(初始化):ht ... -
DatagramChannelImpl 解析一(初始化)
2017-05-08 21:52 1332Channel接口定义:http://donald-drape ... -
MembershipKeyImpl 简介
2017-05-08 09:11 872MembershipKey定义:http://donald-d ... -
DatagramChannel定义
2017-05-07 23:13 1182Channel接口定义:http://donald-drape ... -
MulticastChanne接口定义
2017-05-07 13:45 1069NetworkChannel接口定义:ht ... -
MembershipKey定义
2017-05-06 16:20 831package java.nio.channels; i ...
相关推荐
【Android】开发BLE 串口调试工具,用来和底层进行一些握手协议的调试。
机械设计自动锁垫片机(sw18可编辑+工程图+BOM)非常好的设计图纸100%好用.zip
基于Mediapipe的手势识别前端应用可执行程序+说明.zip # 项目简介 * 基于AutoHotkey制作的摄像头手势识别软件。能让你的电脑摄像头在识别手势后,执行自定义的电脑操作命令。同时也集成了语音识别功能,可调用Windows自带API实现简单的语音助手功能。 * 手势识别调用了高性能的Mediapipe动态链接库来免部署实现。而电脑自动化操作使用AutoHotkey脚本语言来实现,它能更方便的对电脑进行深度调用和流程自动化处理。 # 使用介绍 * 测试环境:Win10 64位(专业版完整镜像) * **第一次运行 Visual_Gesture_Recognition.exe**时,会提示下载手势识别的**依赖包**。点击**确定**后,跟着提示**点击自动下载**
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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
python烟花代码python烟花代码.zip python烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zippython烟花代码.zip
如何提高APP商业变现能力.docx
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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
在数字化时代,数据已成为一种宝贵的资源,而数据分析则是解锁这一资源的关键。数据分析是指运用适当的统计分析和数据挖掘方法,对收集来的大量数据进行详细的研究和概括总结,以最大化地开发数据的功能,发挥数据的作用。 数据分析的过程涉及数据的收集、整理、转化、建模和解释等多个环节。通过对比分析法、分组分析法、结构分析法等多种方法,我们能够深入挖掘数据中的隐藏信息和内在规律,为企业决策、市场研究、科学研究等领域提供有力的支持。 数据分析在现代社会中的应用越来越广泛。例如,在市场调研中,通过对消费者需求、竞争品牌分布等数据的分析,企业可以了解市场潜力、竞争优势和定位策略,从而制定有效的市场推广策略。在社交媒体数据分析中,企业可以通过分析用户的关注人群、点赞、转发等行为,揭示用户的兴趣爱好、消费倾向和口碑传播效果,从而制定有针对性的营销策略。 数据分析工具和技术的发展也极大地推动了数据分析的普及和应用。如R语言和Python语言等编程工具,以及SAS等商业化的数据分析软件,都为数据分析提供了强大的支持。这些工具不仅具有丰富的统计函数和图表绘制能力,还具有高度的灵活性和可扩展性,可以满足各种要求
水和废水处理化学品的选择和使用指南
在Python中,可以使用多种方法来创建一个虚拟棋盘。下面是一个简单的示例,使用字符串和循环来创建一个8x8的国际象棋棋盘。 这段代码定义了一个函数print_chessboard,它首先定义了棋盘的一半,然后通过循环来构建整个棋盘。棋盘的每个格子用空格分隔,并且棋盘的行号用数字表示。棋盘的黑白格子使用字符串white和black来表示,其中white表示白格子,而black表示黑格子。 运行这段代码,你会在控制台看到一个8x8的棋盘,其中棋盘的行号从1到8,列号从A到H,棋盘的黑白格子交替出现。 请注意,这个棋盘是虚拟的,仅用于展示布局,并没有实现任何棋盘游戏的逻辑。如果你需要实现一个可以进行游戏的棋盘,你需要添加更多的代码来处理棋子的移动和游戏规则。
系统使用了Modbus协议完成数据的获取工作,通过Mqtt协议与后端进行连接,获取了数据,完成了数据采集工作。后端通过对数据的处理,进行了数据存储,和接口api的处理。通过WebSocket协议来推送数据。前端展示请求的后端数据。通过此流程完成了工业暖通空调系统的开发。
机械设计大倾角波状挡边带式输送机sw17可编辑非常好的设计图纸100%好用.zip
常见移动变现术语(mobile monetization).docx
把input里面的数据替换成自己的数据,打开R,点Run,可以直接出图!文件适合有R语言基础的同学。
福克斯初级和猎犬初级电线追踪工具包使用说明书
数据库实验报告 SJK完整性语言
PDU8000 ATS配电箱-T 快速指南
串口协议 串口通过 YMODEM 协议进行文件传输 开发环境 框架:Qt 5.7.1 编译器:MSVC2015_64bit IDE:Qt Creator 4.2.0 社区版 操作系统:Windows 10 专业版
开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg
SITOP 电源电源电源电源 20 6EP1 536-2AA00 操作手册