首页 文章 精选 留言 我的

精选列表

搜索[开发者预览],共10000篇文章
优秀的个人博客,低调大师

Android开发者指南(1) —— Android Debug Bridge(adb)(上)

正文 Android Debug Bridge Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具,采用了客户端-服务器模型,包括三个部分: *客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。 *服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。 *守护进程部分,运行于模拟器或手机的后台。 当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。 接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接,例如: Emulator 1 ,console: 5554 Emulator 1 ,adb: 5555 Emulator 2 ,console: 5556 Emulator 2 ,adb: 5557 ... 即如果模拟器与adb在5555端口连接,则其与控制台的连接就是5554端口。 当服务端与所有的模拟器建立连接之后,就可以使用adb命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个adb客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。 下文介绍了可以用来管理模拟器或手机的这些adb命令。如果是在Eclipse并且安装了ADT插件的环境下开发Android应用程序,就不需要从命令行使用adb了,ADT插件已经提供了透明的集成。不过,还是可以在调试等需要的时候直接使用adb。 使用adb命令 从开发用电脑的命令行或脚本文件中使用adb命令的用法是: 当使用的时候,程序会调用adb客户端。因为adb客户端不需要关联到任何模拟器,所以如果有多个模拟器或手机正在运行,就需要使用-d参数指定要操作的是哪一个,更多关于这些选项参数的使用可以参见Directing Commands to a Specific Emulator/Device Instance。 查询模拟器或手机状态 了解adb服务端连接的模拟器或手机可以帮助更好的使用adb命令,这可以通过devices命令列举出来: 执行结果是adb为每一个设备输出以下状态信息: *序列号(serialNumber)—由adb创建的使用控制台端口号的用于唯一标识一个模拟器或手机设备的字符串,格式是<设备类型>-<端口号>,例如:emulator-5554 *状态(state)—连接状态,其值是: offline—未连接或未响应 device—已经连接到服务商。注意这个状态并不表示Android系统已经完全启动起来,系统启动的过程中已经可以连接adb,但这个状态是正常的可操作状态。 每一个设备的输出形如: 下面是devices命令和其执行结果: 如果没有模拟器或手机在运行,该状态返回的是no device。 操作指定的模拟器或手机 如果有多个模拟器或手机正在运行,当使用adb命令的时候就需要指定目标设备,这可以通过使用-s选项参数实现,用法是: 即可以在adb命令中使用序列号指定特定的目标,前文已经提到的devices命令可以实现查询设备的序列号信息。 例如: 需要注意的是,如果使用了-s而没有指定设备的话,adb会报错。 安装应用程序 可以使用adb从开发用电脑中复制应用程序并且安装到模拟器或手机上,使用install命令即可,在这个命令中,必须指定待安装的.apk文件的路径: 关于创建可安装的应用的更多信息,请参见Android Asset Packaging Tool(aapt). 注意,如果使用了安装有ADT插件的Eclipse开发环境,就不需要直接使用adb或aapt命令来安装应用程序了,ADT插件可以自动完成这些操作。 转发端口 可以使用forward命令转发端口—将特定端口上的请求转发到模拟器或手机的不同的端口上。下例是从6100端口转到7100端口: 也可以使用UNIX命名的socket标识: 与模拟器或手机传输文件 可以使用adb的pull和push命令从模拟器或手机中复制文件,或者将文件复制到模拟器或手机中。与install命令不同,它仅能复制.apk文件到特定的位置,pull和push命令可以复制任意文件夹和文件到模拟器或手机的任何位置。 从模拟器或手机中复制一个文件或文件夹(递归的)使用: 复制一个文件或文件夹(递归的)到模拟器或手机中使用: 在这个命令中<local>和<remote>引用的是文件或文件夹的路径,在开发用电脑上的是local,在模拟器或手机上的是remote。 例如: adb命令列表 下表列出了所有adb支持的命令及其说明: 类别 命令 说明 备注 可选项 -d 命令仅对USB设备有效 如果有多个USB设备就会返回错误 -e 命令仅对运行中的模拟器有效 如果有多个运行中的模拟器就会返回错误 -s <serialNumber> 命令仅对adb关联的特定序列号的模拟器或手机有效(例如"emulator-5556"). 如果不指定设备就会返回错误 一般项 devices 输出所有关联的模拟器或手机设备列表 参见Querying for Emulator/Device Instances以获得更多信息。 help 输出adb支持的命令 version 输出adb的版本号 调试项 logcat [<option>] [<filter-specs>] 在屏幕上输出日志信息 bugreport 为报告bug,在屏幕上输出dumpsys,dumpstate和logcat数据 jdwp 输出有效的JDWP进程信息 可以使用forward jdwp:<pid>转换端口以连接到指定的JDWP进程,例如: adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 数据项 install <path-to-apk> 安装应用程序(用完整路径指定.apk文件) pull <remote> <local> 从开发机COPY指定的文件到模拟器或手机 push <local> <remote> 从模拟器或手机COPY文件到开发机 端口和网络项 forward <local> <remote> 从本地端口转换连接到模拟器或手机的指定端口 端口可以使用以下格式表示: ltcp:<portnum> llocal:<UNIX domain socket name> ldev:<character device name> ljdwp:<pid> ppp <tty> [parm]... 通过USB运行UPP l<tty>—PPP流中的tty。例如:/dev/omap_csmi_ttyl。 l[parm]...— 0到多个PPP/PPPD选项,例如defaultroute, local, notty等等。 注意不用自动启动PPP连接 脚本项 get-serialno 输出adb对象的序列号 参见Querying for Emulator/Device Instances以获得更多信息。 get-state 输出adb设备的状态 wait-for-device 阻塞执行直到设备已经连接,即设备状态是device. 可以在其他命令前加上此项,那样的话adb就会等到模拟器或手机设备已经连接才会执行命令,例如: 注意该命令并不等待系统完全启动,因此不能追加需要在系统完全启动才能执行的命令,例如install命令需要Android包管理器支持,但它必须在系统完全启动后才有效。下面的命令 会在模拟器或手机与adb发生连接后就执行install,但系统还没有完全启动,所以会引起错误。 服务端项 start-server 检测adb服务进程是否启动,如果没启动则启动它。 kill-server 终止服务端进程 Shell shell 在目标模拟器或手机上启动远程SHELL 参见Issuing Shell Commands以获得更多信息。 shell [<shellCommand>] 在目标模拟器或手机上执行shellCommand然后退出远程SHELL 执行Shell命令 Adb提供了shell来在模拟器或手机上运行各种各样的命令,这些命令的二进制形式存在于这个路径中: 无论是否进入adb远程shell,都可以使用shell命令来执。 在未进入远程shell的情况下可以按下述格式执行单条命令: 启动远程shell使用下面的格式: 退出远程shell时使用CTRL+D或exit终止会话。 以下是可以使用的shell命令的更多信息。 从远程shell检查sqlite3数据库 通过远程shell,可以使用sqlite3命令行程序来管理由应用程序创建的SQLite数据库。sqlite3工具包含很多有用的命令,例如.dump用于输出表格的内容,.schema用于为已经存在的表输出SQL CREATE语句。并且该工具也提供了联机执行SQLite命令的能力。 使用sqlite3时,向前文描述的那样进入模拟器的远程shell,然后使用sqlite3命令。也可以在调用sqlite3时指定数据库的全路径。SQLite3数据库存储在/data/data/<package_name>/databases/路径下。 示例: 一旦运行了sqlite3,就可以使用sqlite3命令,退出并返回远程shell可以使用exit或CTRL+D。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582291,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发者指南(1) —— Android Debug Bridge(adb)(下)

使用Monkey进行UI或应用程序测试 Monkey是运行于模拟器或手机上的一个程序,通过生成伪随机的大量的系统级的用户事件流来模拟操作,包括单击、触摸、手势等。从而为正在开发中的应用程序通过随机响应进行压力测试。 最简单使用monkey的方式是通过下面的命令行,它可以运行指定的应用程序并向其发送500个伪随机事件。 关于monkey更多的选项及详细信息,请参见UI/Application Exerciser Monkey。 其他Shell命令 下表列出了很多有效的adb shell命令,完整的列表可以通过启动模拟器并且使用adb–help命令获取。 帮助对于大部分命令是有效的。 Shell命令 描述 备注 dumpsys 在屏幕上显示系统数据 TheDalvik Debug Monitor Service(DDMS)工具提供了更易于使用的智能的调试环境。 dumpstate 将状态输出到文件 logcat [<option>]... [<filter-spec>]... 输出日志信息 dmesg 在屏幕上输出核心调试信息 start 启动或重新启动模拟器或手机 stop 停止模拟器或手机 使用logcat查看日志 Android日志系统提供了从众多应用程序和系统程序中收集和查看调试信息的机制,这些信息被收集到一系统循环缓冲区中,可以logcat命令查看和过滤。 使用logcat命令 查看和跟踪系统日志缓冲区的命令logcat的一般用法是: 下文介绍过滤器和命令选项,详细内容可参见Listing of logcat Command Options。 可以在开发机中通过远程shell的方式使用logcat命令查看日志输出: 如果是在远程shell中可直接使用命令: 过滤日志输出 每一条日志消息都有一个标记和优先级与其关联。 标记是一个简短的字符串,用于标识原始消息的来源(例如"View"来源于显示系统)。 优先级是下面的字符,顺序是从低到高: V—明细(最低优先级) D—调试 I—信息 W—警告 E—错误 F—严重错误 S—无记载(最高优先级,没有什么会被记载) 通过运行logcat,可以获得一个系统中使用的标记和优先级的列表,观察列表的前两列,给出的格式是<priority>/<tag>。 这里是一个日志输出的消息,优先级是“I”,标记是“ActivityManager”: 如果想要减少输出的内容,可以加上过滤器表达式进行限制,过滤器可以限制系统只输出感兴趣的标记-优先级组合。 过滤器表达式的格式是tag:priority ...,其中tag是标记,priority是最小的优先级,该标记标识的所有大于等于指定优先级的消息被写入日志。也可以在一个过滤器表达式中提供多个这样的过滤,它们之间用空格隔开。 下面给出的例子是仅输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志: adb logcatActivityManager:IMyApp:D*:S 上述表达式最后的*:S用于设置所有标记的日志优先级为S,这样可以确保仅有标记为“View”(译者注:应该为ActivityManager,原文可能是笔误)和“MyApp”的日志被输出,使用*:S是可以确保输出符合指定的过滤器设置的一种推荐的方式,这样过滤器就成为了日志输出的“白名单”。 下面的表达是显示所有优先级大于等于“warning”的日志: adb logcat*:W 如果在开发用电脑上运行logcat(相对于运行运程shell而言),也可以通过ANDROID_LOG_TAGS环境变量设置默认的过滤器表达式: exportANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S" 需要注意的是,如果是在远程shell或是使用adb shell logcat命令运行logcat,ANDROID_LOG_TAGS不会导出到模拟器或手机设备上。 控制日志格式 日志消息在标记和优先级之外还有很多元数据字段,这些字段可以通过修改输出格式来控制输出结果,-v选项加上下面列出的内容可以控制输出字段: brief—显示优先级/标记和原始进程的PID (默认格式) process—仅显示进程PID tag—仅显示优先级/标记 thread—仅显示进程:线程和优先级/标记 raw—显示原始的日志信息,没有其他的元数据字段 time—显示日期,调用时间,优先级/标记,PID long—显示所有的元数据字段并且用空行分隔消息内容 可以使用-v启动logcat来控制日志格式: 例如使用thread输出格式: 注意只能在-v选项中指定一种格式。 Viewing Alternative Log Buffers Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b选项,以下是可以指定的缓冲区: radio—查看包含在无线/电话相关的缓冲区消息 events—查看事件相关的消息 main—查看主缓冲区(默认缓冲区) -b选项的用法: 例如查看radio缓冲区: 查看stdout和stderr 默认的,Android系统发送stdout和stderr(System.out和System.err)输出到/dev/null。在Dalvik VM进程,可以将输出复制到日志文件,在这种情况下,系统使用stdout和stderr标记写入日志,优先级是I。 要想使用这种方式获得输出,需要停止运行中的模拟器或手机,然后使用命令setprop来允许输出重定位,示例如下: 系统会保留这一设置直到模拟器或手机退出,也可以在设备中增加/data/local.prop以使得这一设备成为默认配置。 Logcat命令选项列表 选项 描述 -b<buffer> 加载不同的缓冲区日志,例如event或radio。main缓冲区是默认项,参见Viewing Alternative Log Buffers. -c 清空(刷新)所有的日志并且退出 -d 在屏幕上输出日志并退出 -f <filename> 将日志输出到文件<filename>,默认输出是stdout. -g 输出日志的大小 -n <count> 设置最大的循环数据<count>,默认是4,需要-r选项 -r <kbytes> 每<kbytes>循环日志文件,默认是16,需要-f选项 -s 设置默认的过滤器为无输出 -v <format> 设置输出格式,默认的是brief,支持的格式列表参见Controlling Log Output Format. 停止adb服务 在某些情况下,可能需要终止然后重启服务端进程,例如adb不响应命令的时候,可以通过重启解决问题。 使用kill-server可以终止服务端,然后使用其他的adb命令重启。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582292,如需转载请自行联系原作者

优秀的个人博客,低调大师

Node.js对于Java开发者而言是什么?

我们都知道Node.js现在得到了所有的关注。每个人都对学习Node.js感兴趣,并希望可以工作于Node.js。在开始工作之前了解技术背后的概念总是不会错的。但对初学者来说,可能会因为不同的人使用的不同定义而晕头转向。Node.js究竟是什么?它是新的语言还是新的框架,是新的工具抑或只是一个简单的JavaScript文件?即使对于有经验的Java开发人员来说,也很难快速了解Node.js。因此,在本文中,我将尝试为Java开发人员诠释Node.js。 运行时环境 我们知道Java需要一个称为JRE的运行时环境来运行Java程序。JRE有一个称为Java Virtual Machine(JVM)的虚拟机。JVM有许多组件,如垃圾回收器(GC),即时(JIT)编译器,解释器,类装载器,线程管理器,异常处理器,用于在不同时间执行不同的任务。 除了JVM之外,JRE还有一系列的库(例如,rt.jar)来帮助运行时的Java程序。我们有单独的JRE用于不同的平台,如Windows,Macintosh和Linux,以及还有JVM。 好吧,就试着记住如何编译和执行一个Java程序。我们有源代码(.java),它由Java编译器编译成一个名为Bytecode(.class)的中间代码。此Bytecode被提供给JVM以便在给定的目标平台上执行。JVM在执行之前将Bytecode转换为特定于目标平台的机器码。 Java程序的执行可以通过下面的图片解释: Web应用程序架构 典型的Java Web应用程序架构有四个层:客户层(Client),展示层(Presentation),服务/业务层(Service/Business)和数据层(Data)。 客户层(Client layer)可以使用像jQuery这样的库来支持AJAX功能并且具有一些客户端验证和DOM操作。 展示层(Presentation layer)通常是与客户层交互的一个层。该层通常已经实现了用于请求和响应处理的MVC模式。在这一层可以使用如Spring MVC这样的框架。此外,还有一个模板引擎,如Velocity,可以根据预定义的布局动态地渲染视图。 服务或业务层(Service/Business layer)负责具备业务逻辑并与其他层通信。在AJAX请求的情况下,该层直接向客户层提供数据。此层执行业务逻辑并回应到展示层以更新模型。服务层是与数据层通信以获取或更新所需数据的一个层。服务层可以具有使用任何框架,例如Spring的SOAP或REST服务实现。 数据层(Data layer)通常使用一些ORM框架,如Hiberate,或任何基于JDBC的库/模板(Spring JDBC模板)来与任意RDBMS(如Oracle)进行通信。 架构部署 Java Web应用程序架构部署包括Apache HTTP服务器,它充当代理服务器以及提供静态内容。动态内容由Web容器提供,Web容器实际上是处理Java文件的引擎。 下图说明了Java Web应用程序的架构部署: 我如何理解Node.js? 运行时环境 我们上面讨论JRE的原因是为了直接与Node.js进行比较。对,你看明白了吧! Node.js不是一种语言;不是框架;也不是工具。它是用于运行基于JavaScript应用程序的运行时环境。 与JRE类似,Node.js有一个称为JavaScript Virtual Machine(JsVM?)的虚拟机。它为基于JavaScript的应用程序生成机器代码,以便在不同的平台上启用它。 Node.js还有一系列库,它们可能被称为Node API或Node Modules,用于帮助在运行时运行JavaScript应用程序,类似于JRE中的Java库。我们对不同的平台,如Windows,Macintosh和Linux,以及JsVM有不同的Node.js要求。 JavaScript Virtual Machine就是V8,来自Google的开源JavaScript引擎。与Java Virtual Machine一样,JsVM(V8引擎)也有主要组件,如JIT和GC,分别用于执行任务,运行时编译,和内存管理。 现在,让我们试试理解JavaScript程序是如何编译和执行的。源代码是用JavaScript(.js)编写的。在将其提供给JsVM(V8引擎)之前,没有生成中间代码。JsVM直接获取此源代码并将其编译为特定于给定目标平台的机器代码以便执行。 下面的图片可以简明地说明上述解释: Web应用程序架构 基于Node.js的Web应用程序主要遵循Java Web应用程序架构。主要区别在于客户端请求处理。客户端请求将由单个线程处理,但在Node.js应用程序的情况下将异步处理。使用Java,每个客户端请求将由单独的线程同步处理,因此它是多线程的。 有许多框架/库可用于基于Node.js的Web应用程序开发。这里有趣的地方在于,所有的框架/库都是基于JavaScript的。 你可以从下面的图片中快速理解不同的层和在那些Node.js应用程序层中使用的框架/库。 客户层使用Angular.js,客户端MVC框架。展示层,以及服务层,可以通过使用Express.js,一个基于JavaScript的Web应用程序框架来开发。这也自带一个用于运行Node.js应用程序的独立服务器。数据层使用对象数据建模模块(例如Mongoose.js)来与NoSQL数据库(如MongoDB)通信。 这个特殊的栈称为MEAN,它由MongoDB,Express.js,Angular.js,客户端MVC框架和Node.js(运行时环境)组成。 架构部署 基于Node.js的Web应用程序的架构部署遵循Java的Web应用程序部署架构。它有一个NGINX服务器,它的作用就如同HTTP代理服务器,并提供静态内容。动态内容由Node.js服务器提供,该服务器包含处理JavaScript文件的引擎。 下面的图解释了基于Node.js的Web应用程序的架构部署: 就这样? 请注意,这篇文章的目的只是为了帮助从Java开发人员的角度理解Node.js,而不是为了显摆对Java或Node.js的支持。此外,除了我们在讨论中涉及到的之外,还有许多不同的架构解决方案、框架和工具。为了便于比较和理解,我采用了最简单和可行的架构解决方案以及最简单的框架和库系列。因此,请务必更进一步地去深入了解。祝大家学习愉快! 作者:佚名 来源:51CTO

优秀的个人博客,低调大师

Node.js对Java开发者而言是什么?

我们都知道Node.js现在得到了所有的关注。每个人都对学习Node.js感兴趣,并希望可以工作于Node.js。在开始工作之前了解技术背后的概念总是不会错的。但对初学者来说,可能会因为不同的人使用的不同定义而晕头转向。Node.js究竟是什么?它是新的语言还是新的框架,是新的工具抑或只是一个简单的JavaScript文件?即使对于有经验的Java开发人员来说,也很难快速了解Node.js。因此,在本文中,我将尝试为Java开发人员诠释Node.js。 运行时环境 我们知道Java需要一个称为JRE的运行时环境来运行Java程序。JRE有一个称为Java Virtual Machine(JVM)的虚拟机。JVM有许多组件,如垃圾回收器(GC),即时(JIT)编译器,解释器,类装载器,线程管理器,异常处理器,用于在不同时间执行不同的任务。 除了JVM之外,JRE还有一系列的库(例如,rt.jar)来帮助运行时的Java程序。我们有单独的JRE用于不同的平台,如Windows,Macintosh和Linux,以及还有JVM。 好吧,就试着记住如何编译和执行一个Java程序。我们有源代码(.java),它由Java编译器编译成一个名为Bytecode(.class)的中间代码。此Bytecode被提供给JVM以便在给定的目标平台上执行。JVM在执行之前将Bytecode转换为特定于目标平台的机器码。 Java程序的执行可以通过下面的图片解释: Web应用程序架构 典型的Java Web应用程序架构有四个层:客户层(Client),展示层(Presentation),服务/业务层(Service/Business)和数据层(Data)。 客户层(Client layer)可以使用像jQuery这样的库来支持AJAX功能并且具有一些客户端验证和DOM操作。 展示层(Presentation layer)通常是与客户层交互的一个层。该层通常已经实现了用于请求和响应处理的MVC模式。在这一层可以使用如Spring MVC这样的框架。此外,还有一个模板引擎,如Velocity,可以根据预定义的布局动态地渲染视图。 服务或业务层(Service/Business layer)负责具备业务逻辑并与其他层通信。在AJAX请求的情况下,该层直接向客户层提供数据。此层执行业务逻辑并回应到展示层以更新模型。服务层是与数据层通信以获取或更新所需数据的一个层。服务层可以具有使用任何框架,例如Spring的SOAP或REST服务实现。 数据层(Data layer)通常使用一些ORM框架,如Hiberate,或任何基于JDBC的库/模板(Spring JDBC模板)来与任意RDBMS(如Oracle)进行通信。 架构部署 Java Web应用程序架构部署包括Apache HTTP服务器,它充当代理服务器以及提供静态内容。动态内容由Web容器提供,Web容器实际上是处理Java文件的引擎。 下图说明了Java Web应用程序的架构部署: 我如何理解Node.js? 运行时环境 我们上面讨论JRE的原因是为了直接与Node.js进行比较。对,你看明白了吧! Node.js不是一种语言;不是框架;也不是工具。它是用于运行基于JavaScript应用程序的运行时环境。 与JRE类似,Node.js有一个称为JavaScript Virtual Machine(JsVM?)的虚拟机。它为基于JavaScript的应用程序生成机器代码,以便在不同的平台上启用它。 Node.js还有一系列库,它们可能被称为Node API或Node Modules,用于帮助在运行时运行JavaScript应用程序,类似于JRE中的Java库。我们对不同的平台,如Windows,Macintosh和Linux,以及JsVM有不同的Node.js要求。 JavaScript Virtual Machine就是V8,来自Google的开源JavaScript引擎。与Java Virtual Machine一样,JsVM(V8引擎)也有主要组件,如JIT和GC,分别用于执行任务,运行时编译,和内存管理。 现在,让我们试试理解JavaScript程序是如何编译和执行的。源代码是用JavaScript(.js)编写的。在将其提供给JsVM(V8引擎)之前,没有生成中间代码。JsVM直接获取此源代码并将其编译为特定于给定目标平台的机器代码以便执行。 下面的图片可以简明地说明上述解释: Web应用程序架构 基于Node.js的Web应用程序主要遵循Java Web应用程序架构。主要区别在于客户端请求处理。客户端请求将由单个线程处理,但在Node.js应用程序的情况下将异步处理。使用Java,每个客户端请求将由单独的线程同步处理,因此它是多线程的。 有许多框架/库可用于基于Node.js的Web应用程序开发。这里有趣的地方在于,所有的框架/库都是基于JavaScript的。 你可以从下面的图片中快速理解不同的层和在那些Node.js应用程序层中使用的框架/库。 客户层使用Angular.js,客户端MVC框架。展示层,以及服务层,可以通过使用Express.js,一个基于JavaScript的Web应用程序框架来开发。这也自带一个用于运行Node.js应用程序的独立服务器。数据层使用对象数据建模模块(例如Mongoose.js)来与NoSQL数据库(如MongoDB)通信。 这个特殊的栈称为MEAN,它由MongoDB,Express.js,Angular.js,客户端MVC框架和Node.js(运行时环境)组成。 架构部署 基于Node.js的Web应用程序的架构部署遵循Java的Web应用程序部署架构。它有一个NGINX服务器,它的作用就如同HTTP代理服务器,并提供静态内容。动态内容由Node.js服务器提供,该服务器包含处理JavaScript文件的引擎。 下面的图解释了基于Node.js的Web应用程序的架构部署: 就这样? 请注意,这篇文章的目的只是为了帮助从Java开发人员的角度理解Node.js,而不是为了显摆对Java或Node.js的支持。此外,除了我们在讨论中涉及到的之外,还有许多不同的架构解决方案、框架和工具。为了便于比较和理解,我采用了最简单和可行的架构解决方案以及最简单的框架和库系列。因此,请务必更进一步地去深入了解。祝大家学习愉快! 来源:51CTO

优秀的个人博客,低调大师

为什么Android开发者应该使用FlatBuffers替代JSON?

你可能会问,既然我们已经有很标准的JSON以及转换库比如GSON和Jackson,为什么还要使用新的工具呢? 不妨先试一下FlatBuffers,然后你就会发现它比JSON快得多。 FlatBuffers是什么? FlatBuffers是一个高效的跨平台序列化类库,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google开发的,是为了应用在游戏开发,以及其他注重性能的应用上。 为什么要使用FlatBuffers? 不需要解析/拆包就可以访问序列化数据 — FlatBuffers与其他库不同之处就在于它使用二进制缓冲文件来表示层次数据,这样它们就可以被直接访问而不需解析与拆包,同时还支持数据结构进化(前进、后退兼容性)。 内存高效速度快 — 访问数据时只需要访问内存中的缓冲区。它不需要多余的内存分配(至少在C++是这样,其他语言中可能会有变动)。FlatBuffers还适合配合mmap或数据流使用,只需要缓冲区的一部分存储在内存中。访问时速度接近原结构访问,只有一点延迟(一种虚函数表vtable),是为了允许格式升级以及可选字段。FlatBuffers适合那些花费了大量时间和空间(内存分配)来访问和构建序列化数据的项目,比如游戏以及其他对表现敏感的应用。可以参考这里的基准。 灵活 — 由于有可选字段,你不但有很强的升级和回退兼容性(对于历史悠久的游戏尤其重要,不用为了每个版本升级所有数据),在选择要存储哪些数据以及设计数据结构时也很自由。 轻量的code footprint — FlatBuffers只需要很少量的生成代码,以及一个表示最小依赖的很小的头文件,很容易集成。细节上可以看上面的基准页。 强类型 — 编译时报错,而不需要自己写重复的容易出错的运行时检查。它可以自动生成有用的代码。 使用方便 — 生成的C++代码允许精简访问与构建代码。还有可选的用于实现图表解析、类似JSON的运行时字符串展示等功能的方法。(后者比JSON解析库更快,内存效率更高) 代码跨平台且没有依赖 — C++代码可以运行在任何近代的gcc/clang和VS2010上。同时还有用于测试和范例的构建文件(Android中.mk文件,其他平台是cmake文件)。 都有谁使用FlatBuffers? BobbleApp,印度第一贴图App。我们在BobbleApp中使用FlatBuffers后App的性能明显增强。 Cocos2d-x,第一开源移动游戏引擎,使用FlatBuffers来序列化所有的游戏数据。 Facebook使用FlatBuffers在Android App中进行客户端服务端的沟通。他们写了一篇文章来描述FlatBuffers是如何加速加载内容的。 Google的Fun Propulsion Labs在他们所有的库和游戏中大量使用FlatBuffers。 App性能有多大提高? 解析速度 解析一个20KB的JSON流(这差不多是BobbleApp的返回大小)需要35ms,超过了UI刷新间隔也就是16.6ms。如果解析JSON的话,我们就在滑动时就会因为要从磁盘加载缓存而导致掉帧(视觉上的卡顿)。 解析器初始化 一个JSON解析器需要先构建字段映射再进行解析,这会花100ms到200ms,很明显的拖缓App启动时间。 垃圾回收 在解析JSON时创建了很多小对象,在我们的试验中,解析20kb的JSON流时,要分配大约100kb的瞬时存储,对Java内存回收造成很大压力。 FlatBuffers vs JSON 我尝试使用FlatBuffers和JSON解析4mb的JSON文件。 FlatBuffers花了1-5ms,JSON花了大约2000ms。在使用FlatBuffers期间Android App中没有GC,而在使用JSON时发生了很多次GC。在使用JSON时UI完全卡住,所以真实使用时只能在后台线程进行解析。 如何使用FlatBuffer呢? 我在我的GitHub中写了一个示例,里面手把手教你如何使用FlatBuffer。 ====================================分割线================================ 本文转自d1net(转载)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册