`
444878909
  • 浏览: 641040 次
文章分类
社区版块
存档分类
最新评论

Android实战技术:理解Binder机制

 
阅读更多
Android中的RPC(IPC)是由Binder组件来实现的,虽然我们使用更多的还是AIDL,并不会直接使用Binder,但是了解了它能更有效帮助理解AIDL以及理解Android本身的一些原理和机制。

Binder的架构

与其他的Android系统的组件的架构类似,Binder也是由Java层封装,JNI,libbinder和driver组成。

Binder的主要组成有三个IInterface, IBinder, Binder和BinderProxy。但是我们需要关注的仅是Binder对象和BinderProxy。其中BinderProxy是给客户端使用的,客户端通过调用其上的transact来marshalling数据,并且向底层发送消息;Binder是给服务端使用的,服务端要实现onTransact方法,以便处理客户端的方法调用请求并返回结果。IInterface接口主要是给系统使用的,用于在ServiceManager中查找对应的Service。它们之间的关系是:


关键的对象就是BinderProxy和Binder,BinderProxy是给客户端使用的对象,它的工作就是marshalling,然后调用IBinder的transact方法把信息传递出去。而Binder对象则是服务端的对象,它实现了客户端所需要的方法。

Java层的源码:

  • ./frameworks/base/core/java/android/os/IInterface.java
  • ./frameworks/base/core/java/android/os/Binder.java
  • ./frameworks/base/core/java/android/os/IBinder.java
  • ./frameworks/base/core/java/android/os/Parcel.java
  • ./frameworks/base/core/java/android/os/Parcelable.java

JNI Wrapper层:

  • ./frameworks/base/core/jni/android_util_Binder.cpp
  • ./frameworks/base/core/jni/android_util_Binder.h

在Native层使用Binder

除了在Java层使用Binder进行RPC外,在Native层也是可以使用的,因为Java层是依赖于libbinder的,而libbinder,它仅是一个共享库而已,所以在Native层也是可以使用的。只是libbinder并没有在NDK中公开,甚至它没有包含在NDK中,所以只能是在Android系统源码中使用libbinder。Native层使用Binder进行RPC与Java层十分类似,仅是语言语法上面的区别,原理和机制都是一样的,毕竟Java层仅是多穿上一层衣服而已。

libbinder的代码:

  • ./frameworks/base/libs/binder/BpBinder.cpp
  • ./frameworks/base/libs/binder/Binder.cpp
  • ./frameworks/base/include/binder/BpBinder.h
  • ./frameworks/base/include/binder/IBinder.h
  • ./frameworks/base/include/binder/BinderService.h
  • ./frameworks/base/include/binder/Binder.h
  • ./frameworks/base/libs/binder/IInterface.cpp
  • ./frameworks/base/include/binder/IInterface.h
  • ./frameworks/base/libs/binder/Parcel.cpp
  • ./frameworks/base/include/binder/Parcel.h
这里有一个实例,使用libbinder实现一个client与server的通讯。

注意:编译这个示例的方式是把这些文件放在packages/apps/里或者externals中,然后运行mm进行编译,编译好的文件在out/target/product/generic/system/bin下面。adb push到Android 模拟器,然后在adb shell中运行,需要打开二个adb shell一个运行nativeserver,另一个运行nativeclient,最好再用DDMS查看logcat,TAG是native_binder。

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := nativeclient
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := mathinterface.cpp \
	client.cpp

LOCAL_SHARED_LIBRARIES := libutils libcutils libbinder
LOCAL_C_INCLUDES += frameworks/base/include system/core/include

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE := nativeserver
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := mathinterface.cpp \
	server.cpp
LOCAL_SHARED_LIBRARIES := libutils libcutils libbinder
LOCAL_C_INCLUDES += frameworks/base/include system/core/include

include $(BUILD_EXECUTABLE)
The interface:

/**
 * Demonstrate how to us Binder in Native C++ codes.
 *
 * The interface describes the RPC calls.
 *
 * Based on BinderDemo: https://github.com/gburca/BinderDemo/blob/master/binder.cpp
 */
#ifndef _MATH_INTERFACE_H
#define _MATH_INTERFACE_H

#define LOG_TAG "native_binder"

#include <stdlib.h>
#include <binder/IBinder.h>
#include <utils/Log.h>
#include <utils/TextOutput.h>

using namespace android;

#define INFO(...) \
    do { \
        printf(__VA_ARGS__); \
        printf("\n"); \
        LOGD(__VA_ARGS__); \
    } while (0)

/**
 * The interface describing the RPC methods.
 *
 * RefBase is the base class for smart pointer.
 */
class MathInterface : public RefBase {
public:
    enum {
        PRINT = IBinder::FIRST_CALL_TRANSACTION,
        ADD
    };

    virtual void print(const char *msg) = 0;

    virtual int32_t add(int32_t a, int32_t b) = 0;

    static const String16 DESCRIPTOR;

    MathInterface();

    virtual ~MathInterface();
};

#endif
/**
 * Demonstrate how to us Binder in Native C++ codes.
 *
 * The interface describes the RPC calls.
 *
 * Based on BinderDemo: https://github.com/gburca/BinderDemo/blob/master/binder.cpp
 */
#include "mathinterface.h"

const String16 MathInterface::DESCRIPTOR("MathInterface");

MathInterface::MathInterface() {
    INFO("MathInterface::MathInterface()");
}

MathInterface::~MathInterface() {
    INFO("MathInterface::~MathInterface()");
}
Client:

/**
 * Demonstrate how to us Binder in Native C++ codes.
 *
 * The interface describes the RPC calls.
 *
 * Based on BinderDemo: https://github.com/gburca/BinderDemo/blob/master/binder.cpp
 */

#include <stdlib.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
#include <binder/Parcel.h>
#include <utils/TextOutput.h>

#include "mathinterface.h"

using namespace android;

/**
 * The proxy used for client side.
 */
class MathBinderProxy : public MathInterface {
private:
    sp<IBinder> remote;
public:
    MathBinderProxy(const sp<IBinder>& impl);

    void print(const char *msg);

    int32_t add(int32_t a, int32_t b);
};

MathBinderProxy::MathBinderProxy(const sp<IBinder>& impl) {
    INFO("MathBinderProxy::MathBinderProxy()");
    remote = impl;
}

void MathBinderProxy::print(const char *msg) {
    Parcel data, reply;
    data.writeInterfaceToken(MathInterface::DESCRIPTOR);
    data.writeString16(String16(msg));

    aout << "MathBinderProxy::print parcel to be sent:\n";
    data.print(aout);
    endl(aout);
    remote->transact(MathInterface::PRINT, data, &reply, IBinder::FLAG_ONEWAY);
    INFO("MathBinderProxy::print() is returned");
}

int32_t MathBinderProxy::add(int32_t a, int32_t b) {
    Parcel data, reply;
    data.writeInterfaceToken(MathInterface::DESCRIPTOR);
    data.writeInt32(a);
    data.writeInt32(b);

    aout << "MathBinderProxy::add parcel to be sent:\n";
    data.print(aout);
    endl(aout);

    remote->transact(MathInterface::ADD, data, &reply);
    INFO("MathBinderProxy::add transact reply");
    reply.print(aout);
    endl(aout);
    int32_t res;
    status_t status = reply.readInt32(&res);
    INFO("MathBinderProxy::add(%i, %i) = %i(status: %i)",
            a, b, res, status);
    return res;
}

static sp<MathInterface> getMathServer(const char *msg) {
    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> binder = sm->getService(String16(msg));
    if (binder == NULL) {
        INFO("getmath server, cannot find server '%s'", msg);
        return NULL;
    }
    sp<MathInterface> svr = new MathBinderProxy(binder);
    return svr;
}

int main(int argc, char **argv) {
    INFO("we are the client");
    const char *native = "MathServer";
    const char *java = "JavaServerService";
    sp<MathInterface> svc = getMathServer(java);
    if (svc == NULL) {
        INFO("failed to find service");
        return -1;
    }
    svc->print("Hello, welcome to the world of native binder");
    int32_t s = svc->add(2013, 3102);
    INFO("Addition result: %i + %i = %i", 2013, 3102, s);

    return 0;
}
Server:

/**
 * Demonstrate how to us Binder in Native C++ codes.
 *
 * The interface describes the RPC calls.
 *
 * Based on BinderDemo: https://github.com/gburca/BinderDemo/blob/master/binder.cpp
 */
#include <stdlib.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>
#include <utils/TextOutput.h>

#include "mathinterface.h"

using namespace android;

/**
 * The remote binder or the server.
 */
class MathBinder : public BBinder {
protected:
    virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
public:
    virtual void print(const char *msg);
    virtual int32_t add(int32_t a, int32_t b);
};

status_t MathBinder::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
    INFO("MathBinder::onTransact(%i) %i", code, flags);
    /*
     * Before executing actual method, check whether the RPC are from expected client.
     * Client will write interface token, to identify interface to which those methods
     * belong.
     */
    if (!data.enforceInterface(MathInterface::DESCRIPTOR)) {
        INFO("failed to check Interface, you might call wrong service, this is for '%s'",
                String8(MathInterface::DESCRIPTOR).string());
        return BAD_TYPE;
    }
    data.print(aout);
    endl(aout);

    switch(code) {
    case MathInterface::PRINT: {
        String16 msg = data.readString16();
        print(String8(msg).string());
        return NO_ERROR;
    }
    case MathInterface::ADD: {
        int32_t a = data.readInt32();
        int32_t b = data.readInt32();
        int32_t sum = add(a, b);
        INFO("MathBinder:onTransact add(%i, %i) = %i", a, b, sum);
        reply->print(aout); endl(aout);
        reply->writeInt32(sum);
        return NO_ERROR;
    }
    default:
        INFO("MathBinder, bad requesting code, no match found");
    }
    return BBinder::onTransact(code, data, reply, flags);
}

void MathBinder::print(const char *msg) {
    INFO("MathBinder::print, msg is '%s'", msg);
}

int32_t MathBinder::add(int32_t a, int32_t b) {
    return a + b;
}

int main(int argc, char **argv) {
    INFO("We're the service");
    
    defaultServiceManager()->addService(String16("MathServer"),
            new MathBinder());
    ProcessState::self()->startThreadPool();
    INFO("Math server is running now");
    IPCThreadState::self()->joinThreadPool();
    INFO("Math server thread joined");

    return 0;
}

Binder实现的是RPC,它与具体语言无关,所以理论上,基于Binder可以让Native的进程与Android Java层的应用程序通讯。最关键的,也是最麻烦点就在于客户端如何获取服务端的Service的IBinder对象,但也非不可能,要通过JNI和ClassLoader等一系列方式可以获得Java层的对象,其实Java层API的实现也是以这样子的方式,具体的可以参考这篇文章
分享到:
评论

相关推荐

    node-v0.11.6-sunos-x86.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.46-linux-x86.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    计二 王顺.zip

    计二 王顺.zip

    qbittorrent_4.6.4_lt20_qt6_x64_setup.exe

    qbittorrent_4.6.4_lt20_qt6_x64_setup

    课设毕设基于SSM的美食推荐管理系统-LW+PPT+源码可运行.zip

    课设毕设基于SSM的美食推荐管理系统--LW+PPT+源码可运行

    node-v0.11.13-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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于yolov5+SlowFast+pyqt5的人体动作识别项目源码+使用说明(毕业设计).zip

    基于yolov5+SlowFast+pyqt5的人体动作识别项目源码+使用说明(毕业设计).zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 基于yolov5+SlowFast+pyqt5的人体动作识别项目源码+使用说明(毕业设计).zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。基于yolov5+SlowFast+pyqt5的人体动作识别项目源码

    【毕业设计】基于yolov9 ncnn模型部署到android源码+模型+项目说明.zip

    高分毕业设计源码 基于YOLO的毕业选题设计的程序源码,适用与计算机与软件工程毕业设计选题

    node-v0.12.17-linux-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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Qt的简单学生管理系统

    简单的学生管理系统,主要使用的Qt框架,数据库使用的Mysql,包含增删改查,排序等功能

    nodejs-ia32-0.10.13.tgz

    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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    wx078上门维修系统-springboot+vue+uniapp-小程序.zip(可运行源码+sql文件+文档)

    根据本系统的基本设计思路,本系统在设计方面前台采用了java技术等进行基本的页面设计,后台数据库采用MySQL。本系统的实现为上门维修系统的运行打下了基础,为上门维修提供良好的条件。 最后我们通过需求分析、测试调整,与上门维修的实际需求相结合,设计实现了基于微信小程序的上门维修系统。 本课题要求实现优质的上门维修系统,就一定要包含有前台页面和后端数据库、服务器相联系,从而实现系统的功能运转。系统分为前台用户模块、维修员模块和管理员模块三部分;(1)、用户进入系统可以实现首页,广告信息,新闻资讯,我的,在我的页面可以对维修信息,维修记录,评价信息,我的收藏管理进行管理。(2)、维修员进入系统可以实现首页,广告信息,新闻资讯,我的,在我的页面可以对维修信息,维修记录,评价信息等进行管理。(3)、管理员主要包括系统首页,个人中心,用户管理,维修员管理,维修信息管理,维修记录管理,评价信息管理,广告信息管理,系统管理等有关功能进行管理。 关键词:上门维修;java;MySQL数据库

    node-v0.1.94.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Optimizer-16.4.exe

    Optimizer-16.4

    毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip

    毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业,项目都经过严格调试,确保可以运行! 毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学

    【课程设计】基于python实现三维重建算法SFM源码.zip

    【课程设计】基于python实现三维重建算法SFM源码.zip

    kouzhao-mainunity游戏

    unity游戏

    node-v0.10.17-sunos-x64.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.17-sunos-x86.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.40-linux-x64.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics