【chain4.0源码】【c 股票源码】【怎么编译android源码】jdksocket源码

时间:2024-12-22 20:11:21 来源:keylemon 源码 分类:热点

1.【tcp】关于tcp socket出现的“connection reset by peer”和“broken pipe”
2.前端,后端,嵌入式?
3.Java程序员必备基础:JDK 5-15都有哪些经典新特性
4.JDK基础概念及目录结构
5.APP测试练手笔记(1)代码保护与应用配置
6.Netty源码探究1:事件驱动原理

jdksocket源码

【tcp】关于tcp socket出现的“connection reset by peer”和“broken pipe”

       åœ¨socket通信过程中,经常发现客户端或者服务器的日志中出现“broken pipe”或者“connection reset by peer”的错误提示。

        以前一直以为自己理解了这两个错误异常提示所包含的意义,而实际理解完全错误。

        我的错误理解和下面这段来自blogspot的表述差不多:

        ```

        Maybe I'm just dumb, but I always thought "broken pipe" meant, "the other end of this socket closed before I finished sending something" and "connection reset by peer" meant, well, roughly the same thing. (As well as indicating some slightly more esoteric problems.)

        Turns out though, "broken pipe" actually means "I just tried to send something and the socket was already closed to sending."

        So in the following example, if the other end of (TCP) socket "sock" closes or dies before the write method, "connection reset by peer" will be raised. The next write will give a broken-pipe error, since the socket now knows that further sending is invalid.

        ```

        ```

        try:

            sock.write('foo')

        except:

            pass # connection reset by peer

        sock.write('bar') # broken pipe

        ```

       RST的标志位,这个标识为在如下几种情况下会被设置,以下是我了解的情况,可能还有更多的场景,没有验证:

        1. 当尝试和未开放的服务器端口建立tcp连接时,服务器tcp将会直接向客户端发送reset报文

        2. 双方之前已经正常建立了通信通道,也可能进行过了交互,当某一方在交互的过程中发生了异常,如崩溃等,异常的一方会向对端发送reset报文,通知对方将连接关闭

        3. 当收到TCP报文,但是发现该报文不是已建立的TCP连接列表可处理的,则其直接向对端发送reset报文

        4. ack报文丢失,并且超出一定的重传次数或时间后,会主动向对端发送reset报文释放该TCP连接

       å…¶å®žæˆ‘们java异常里看到的Broken pipe或者Connection reset by peer信息不是jdk或者jvm里定义的,我看到这些关键字往往会首先搜索下jdk或者hotspot源码找到位置进行上下文分析,但是没找到,后面才想到应该是Linux或者glibc里定义的,果然在glibc里看到了如上的描述和定义。

        对于Broken pipe在管道的另外一端没有进程在读的时候就会抛出此异常,Connection reset by peer的描述其实不是很正确,从我的实践来看只描述了一方面,其实在某一端正常close之后,也是可能会有此异常的。

       connection reset by peer”和”broken pipe”出现的场景:

        1)往一个对端已经close的通道写数据的时候,对方的tcp会收到这个报文,并且反馈一个reset报文。当收到reset报文的时候,继续做select读数据的时候就会抛出Connect reset by peer的异常,。

        2)当第一次往一个对端已经close的通道写数据的时候会和上面的情况一样,会收到reset报文。当再次往这个socket写数据的时候,就会抛出Broken pipe了 。根据tcp的约定,当收到reset包的时候,上层必须要做出处理,调用将socket文件描述符进行关闭,其实也意味着pipe会关闭,因此会抛出这个顾名思义的异常。

       ä»Žtcp原理角度理解Broken pipe和Connection Reset by Peer的区别

       /blog////tcp-broken-pipe

       å…³äºŽtcp socket出现的”connection reset by peer“和“broken pipe”

       ////%E5%%B3%E4%BA%8Etcp-socket%E5%%BA%E7%8E%B0%E7%9A%connection-reset-by-peer%E5%%8Cbroken-pipe

前端,后端,嵌入式?

       ç¡¬ä»¶å‰ç«¯å¼€å‘和硬件后端开发哪个工资高嵌入式开发和硬件前端开发是一回事吗???

       åµŒå…¥å¼å¼€å‘分硬件和软件开发,其中硬件和软件里面还要细分,很多岗位和领域。说到哪个工资高,不好说,这和不同地域,不同岗位和不同水平有关系,所以不能一概而论。建议无论做到哪个领域,先学好再说,不要太在乎工资。

       è½¯ä»¶å¼€å‘,前端开发,和后端开发,哪个更累,哪个更挣钱,谢谢指点

       é¦–先,软件开发几乎包括了一切,不仅包括前端后端还包括嵌入式都是软件开发。

       å‰ç«¯å¼€å‘跟后端开发,都很累,全看个人。

       å‰ç«¯ç›®å‰æ›´èµšé’±ï¼Œå› ä¸ºå‰ç«¯æ­£åœ¨èš•é£Ÿå…¶ä»–桌面领域的份额,因为前端现在任何界面都可以跑(Linux、Win、Mac、Andriod、iPhone),这些领域的价值正在被转移到前端(特指网页前端),也就是说目前前端是能做事情最多的,至少是看上去。

       å¾€é«˜çº§æŠ€æœ¯è®²ï¼ŒåŽç«¯ä¼šæ¯”前端要难,也要更累,工资也更高。

       æ‰€ä»¥ï¼Œç†è®ºä¸Šï¼Œåˆçº§ç¨‹åºå‘˜å‰ç«¯å·¥èµ„高,高级程序员后端工资高。

       ä½†æ˜¯ï¼Œå®žé™…上,初级才会分前后,高级程序员啥都要。

学java出来后,做前端还是后端好?

       ä»ŽæŠ€æœ¯æœ¬èº«æ¥è¯´ï¼Œjava本身会偏向后端一些;如果你对前端感兴趣的话,像node.js、bootstrap、vue.js等等前端框架看下自己有没有掌握,现在不是懂点Html+css或者能写点ajax就可以做前端了。当然,做前端的话,除此以外,对网站的配色、页面的布局,包括一些审美等等还是有点小要求的,如果你能达到的话,你可以尝试去做前端。

       å°±ç›®å‰æ¥è¯´ï¼Œéšç€å‰åŽç«¯åˆ†ç¦»ï¼Œå‰ç«¯å’ŒåŽç«¯çš„薪资待遇这块儿都差不多了。选择前端还是后端很多时候看个人意愿吧,或者是觉得自己前端强点儿还是后端强点儿!不过,从个人建议上来说还是后端会更好些,因为前端相对来说比较简单,做了一段时间的后端还可以转去做前端。另外的话,就是很多时候几个项目可以用同一套前端框架,需要的话改改就好,除非对前端要求较高,一个项目一套前端,一般像这种情况还是比较少的。

学编程能做什么工作?

       çœ‹ä½ å­¦å“ªæ–¹é¢çš„,学编程可以做前端开发,后端开发,嵌入式开发,还有运维等工作,做前端要学html、css、js和ps,后端的话还要多学一门后端语言java、python等,运维学linux、shell等。

网页设计前端和后端的区别?越详细越好。

       è¯¦ç»†çš„解释一下web前后端的区别

       1、

       å‰å°ï¼šå‘ˆçŽ°ç»™ç”¨æˆ·çš„视觉和基本的操作。

       åŽå°ï¼šç”¨æˆ·æµè§ˆç½‘页时,我们看不见的后台数据跑动。后台包括前端、后端。

       å‰ç«¯ï¼šå¯¹åº”我们写的html、css、javascript等网页语言作用在前端网页。

       åŽç«¯ï¼šå¯¹åº”jsp、javaBean、dao层、action层和service层的业务逻辑代码。(包括数据库)

       ä¸ºä»€ä¹ˆjsp是后端呢?主要是jsp的运行原理是在tomcat服务器运行的。

       2、

       (1)javaweb是java开发中的一个方向java有搞安卓的,搞web的,搞嵌入式的等。javaweb就是指搞web方向的,javaweb分两块,一块是服务器端叫后端,另一块叫前端,也就是web前端。前端就是用户能看到的部分,比如淘宝网,qq空间,网页上你能看到的都是web前端做的。后端做的就是为前端的展示业务逻辑功能做处理。

       (2)javaweb包括了jsp,servelt以及一些框架比如spring,structs以及与数据库交互的知识,当然也涉及到了html,css等前端技术,但是更侧重于后端的开发。web前端主要是html,css,javascript之类的技术。

       jaweb是javaee的一个方向,Javaweb,由前端、Java代码、和数据库三个大方面组成,前端只是其中之一。

       (3)在我们的机子上看到的界面,安装的程序,给用户看的,操作的就是前端;而你看不到的,帮你保存网络游戏数据,保存应用数据,处理数据的就是后端(服务器)。比如说:我们在用的知乎就是前端,而保存这个问题,还有把这个问题推送给你的就是后端。

       äºŒã€å®šä¹‰ä¸åŒ

       ä¸€èˆ¬æ¥è¯´ï¼Œæˆ‘们将网站分为前端和后端。前端主要负责页面的展示,后端则是业务逻辑的实现。

       1、Web前端:

       é¡¾åæ€ä¹‰æ˜¯æ¥åšWeb的前端的。这里所说的前端泛指Web前端,也就是在Web应用中用户可以看得见碰得着的东西。包括Web页面的结构、Web的外观视觉表现以及Web层面的交互实现。

       2、Web后端:

       åŽç«¯æ›´å¤šçš„是与数据库进行交互以处理相应的业务逻辑。需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等。

       ä¸‰ã€éœ€è¦æŽŒæ¡çš„技术不同

       1、Web前端:

       ç²¾é€šJS,能熟练应用JQuery,懂CSS,能熟练运用这些知识,进行交互效果的开发。

       (1)精通HTML,能够书写语义合理,结构清晰,易维护的HTML结构;

       (2)精通CSS,能够还原视觉设计,并兼容业界承认的主流浏览器;

       (3)熟悉JavaScript,了解ECMAScript基础内容,掌握1-2种js框架,如JQuery;

       (4)对常见的浏览器兼容问题有清晰的理解,并有可靠的解决方案;

       (5)对性能有一定的要求,了解yahoo的性能优化建议,并可以在项目中有效实施。

       2、Web后端:

       åŽç«¯å¼€å‘人员:会写Java代码,会写SQL语句,能做简单的数据库设计,会Spring和iBatis,懂一些设计模式等。

       (1)精通jsp,servlet,javabean,JMS,EJB,Jdbc,Flex开发,或者对相关的工具、类库以及框架非常熟悉,如Velocity,Spring,Hibernate,iBatis,OSGI等,对Web开发的模式有较深的理解;

       (2)练使用oracle、sqlserver、mysql等常用的数据库系统,对数据库有较强的设计能力;

       (3)熟悉maven项目配置管理工具,熟悉tomcat、jboss等应用服务器,同时对在高并发处理情况下的负载调优有相关经验者优先考虑;

       (4)精通面向对象分析和设计技术,包括设计模式、UML建模等;

       (5)熟悉网络编程,具有设计和开发对外API接口经验和能力,同时具备跨平台的API规范设计以及API高效调用设计能力。

       å››ã€web后端和前端是怎么连接的?

       1、web服务器(apache、tomcat等),网络协议(或者php等都可能,但javaweb可以确定后端就是java,web前端其实都一样。

       å‰ç«¯å’ŒJavaweb的区别更多的在于一个主要负责前端的设计和效果,而Javaweb更专注于后端的内容。

       3、刚开始从事web开发时,首先要选准学习方向,看是想从事前端部分还是后端程序部分。当然在工作的后期,就不会分的那么细致了。做前端到后期也会懂一些后端的技术,反之,后端也是。

       å…­ã€å­¦ä¹ Web前端开发都需要掌握哪些技能?

       1、学习html。这个是最简单的,也是最基础的.要熟练掌握div、formtable、ulli、p、span、font这些标签,这些都是最常用的,特别是div和table,div用于布局、table也可以用于布局,但是不灵活,基本table是用来和数据打交道。

       2、学习css。这里说的css不包括css3,一般我们看到web前端开发工程师的要求里面,有一个会使用css+html或者css+div来进行界面布局,所以css是用于辅助html来布局和展示的,我们称之为“css样式”,为什么会说css+div呢?因为我上面说了div就是html主要用于布局的东西,所以div就是核心掌握的东西!那么css肯定必须要配合div来使用才好.css要熟练掌握float、position、width、height,以及对于的最大最小、会使用百分百、overflow、margin、padding等等,这些都是跟布局有关系的样式,一点要掌握。

       3、学习js。可能前两个大家觉得还过的去,看到js就傻眼了,其实吧,js入门很简单的,不需要会很多东西的,只要会根据某个id、或者name拿到网页dom或者样式、或者值,然后会给某个id或者name的元素标签赋值、或者追加数据、追html,这个是跟数据有关系的操作,然后数据逻辑判断,效果方面的,无非就是跳转、弹框、隐藏什么的,把这些全部结合其他就是实际用途了,代码一点都不难,会了这些基础js,其他的直接百度就好了.然后看多了,用多了,就什么都不是问题了。

       4、学习jquery。jquery是相当于把js封装了一套的一个js插件,目的就是操作起来更方便,代码写的更少,jquery入门也很简单,那些是入门需要学的和js一样,只是换成了jq的代码.其他的一样百度就够了。

       5、最好会点后台语言,比如java、php,为什么呢?因为前台界面的数据都是从后台来的,如果会点后台代码,就知道怎么跟后台交互数据是最好的,这样节约时间,也可以让前端代码更规范.不然可能因为你的写法和后端给来的数据不能结合上,那么前端代码又得重新写,那就更加麻烦了。

       6、学习css3+html5,可能这个对于更接手的新人来说有点困难,需要较强的代码知识与经验,但是如果你们是准备专门搞前端,那么最好还是学一下,这样对于将来的工作会有更大的帮助。

       ä¸ƒã€ä»Žäº‹Java后端开发都需要掌握哪些技能?

       å¯¹äºŽåˆå­¦Java并且有志于后端开发的同学来说,需要重点关注以下几个部分:

       1、基础:比如计算机系统、算法、编译原理等等

       2、Web开发:主要是Web开发相关的内容,包括HTML/CSS/js(前端页面)、Servlet/JSP(J2EE)以及MySQL(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面)。还有一些前段框架比如easyui,还有js,jquery等技术。

       3、J2EE:你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频。4、数据库:你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。

       5、开发框架:目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。

       6、你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。

       å¸Œæœ›å¯¹æ‚¨æœ‰æ‰€å¸®åŠ©ï¼~

年,前端,移动开发,后端,我该选哪个?

       è¯·å…ˆç»™å‡ºæ˜Žç¡®ç­”复:推荐选前端开发,web前端可以说前途不可限量!

       è§£é‡ŠåŽŸå› ï¼š

       çŽ°åœ¨çš„Web前端技术可以说是越来越成熟了,Web前端市场也非常的火爆,Web前端人才也是异常的紧缺。再者,由于互联网的崛起,Web前端技术的不断发展,也占据了互联网的一席之地。

       é‚£ä¸ºä»€ä¹ˆè¯´Web前端无可限量呢?国外著名的自媒体平台facebook,相信大家多多少少知道一点,也用过一点,它就是Web前端技术的产物,完全基于前端框架打造出来的平台。再者,大家常用的外卖平台饿了么,它旗下的部分产品就是基于Web前端技术的。像淘宝,百度,阿里等等,都已经将Web前端技术打入到了自己的产品中。

       å‰ç«¯å¼€å‘行业薪资水平呈上涨趋势,Web前端开发早已不是做带动画的下拉菜单的时代了,他们已成为互联网主宰者,各行业都用其开发互联网应用。但目前整互联网行业的Web前端开发工程师紧俏,企业正高薪求才,薪资待遇一涨再涨!

       Web前端技术可以说是越来越成熟了,Web前端市场也非常的火爆,Web前端人才也是异常的紧缺。再者,Web前端行业也是无可限量。由于互联网的崛起,Web前端技术的不断发展,也占据了互联网的一席之地。

       Web前端开发工程师已经成为发展中的职业香馍馍。几乎整个互联网行业都缺Web前端工程师,无论是刚起步的创业公司,还是上市公司乃至巨头,空缺一样存在。优秀的Web前端工程师简直比大熊猫还稀少。

       æœ‰æ— è§£å†³åŠžæ³•ï¼šæ‰€ä»¥ï¼Œè¿˜æ˜¯å¾ˆæŽ¨èä½ å­¦ä¹ web前端的;如果真的想学习,可以了解一下北京尚学堂,我们是专门做编程培训的,拥有极其丰厚的师资力量,带给你不一样的学习体验。分享一下前端的知识框架,希望对你有所帮助:

Java程序员必备基础:JDK 5-都有哪些经典新特性

       JDK 发布啦~ 我们一起回顾JDK 5- 的新特性吧,大家一起学习哈~

       Java 5 新特性

       1. 泛型:本质是参数化类型,解决不确定具体对象类型的问题。

       2. 增强循环(for-each):简化了集合的遍历。

       3. 自动封箱拆箱:包装类型有:Integer,Double,Float,Long,Short,Character和Boolean

       4. 枚举:关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的chain4.0源码值可以作为常规的程序组件使用,这就是枚举类型。

       5. 可变参数:我们在定义方法参数的时候不确定定义多少个,就可以定义为「可变参数」,它本质上是一个「数组」。

       6. 注解:可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。

       7. 静态导入:通过import static类,就可以使用类里的静态变量或方法。

       8. 线程并发库(JUC):JDK5 丰富了线程处理功能,java.util.concurrent包提供了以下的类、接口:

       Java 6 新特性

       1. Desktop类和SystemTray类:JDK 6在java.awt包下,新增了两个类。

       2. 使用JAXB2来实现对象与XML之间的映射:JAXB,即Java Architecture for XML Binding,可以实现对象与XML之间的映射。

       3. 轻量级 Http Server API:JDK 6中提供了简单的Http Server API,可以构建嵌入式Http服务器。

       4. 插入式注解处理API:JDK 6提供了插入式注解处理API,可以让我们定义的注解在编译期而不是运行期生效。

       5. STAX:STAX,是c 股票源码JDK6中一种处理XML文档的API。

       6. Common Annotations:Common annotations原本是Java EE 5.0(JSR )规范的一部分。

       7. Compiler API:javac编译器可以把.java的源文件编译为.class文件。

       8. 对脚本语言的支持(如: ruby, groovy, javascript):JDK6增加了对脚本语言的支持。

       Java 7 新特性

       1. switch 支持String字符串类型。

       2. try-with-resources,资源自动关闭

       3. 整数类型如(byte,short,int,long)能够用二进制来表示

       4. 数字常量支持下划线

       5. 泛型实例化类型自动推断,即”<>”

       6. 一个catch中捕获多个异常类型,用(|)分隔开

       7. 增强的文件系统

       8. Fork/join 框架

       Java 8 新特性

       1. lambada表达式

       2. 函数式接口

       3. 方法引用

       4. 默认方法

       5. Stream API

       6. Optional

       7. Date Time API

       8. 重复注解

       9. Base

       . JVM的新特性

       Java 9 新特性

       1. java模块系统

       2. 不可变集合工厂方法

       3. 接口支持私有方法

       4. 钻石操作符升级

       5. Optional 类改进

       6. 多版本兼容Jar包

       7. JShell工具

       8. try-with-resources的改进

       9. Stream API的改进

       Java 新特性

       1. 局部变量类型推断

       2. 不可变集合的改进

       3. 并行全垃圾回收器 G1

       4. 线程本地握手

       5. Optional新增orElseThrow()方法

       6. 其他新特性

       Java 新特性

       1. 字符串操作

       2. 用于 Lambda 参数的局部变量语法

       3. 标准化HTTP Client

       4. 单个命令编译运行源代码

       5. ZGC:可伸缩低延迟垃圾收集器

       6. 其他一些特性

       Java 新特性

       1. Switch 表达式扩展(预览功能)

       2. 紧凑的数据格式

       3. 字符串支持transform、indent操作

       4. Files.mismatch(Path, Path)

       5. Teeing Collector

       6. 其他特性

       Java 新特性

       1. Switch 表达式扩展(引入 yield 关键字)

       2. 文本块升级

       3. SocketAPI 重构

       4. FileSystems.newFileSystem新方法

       5. 增强 ZGC 释放未使用内存

       6. 其他特性

       Java 新特性

       1. instanceof模式匹配

       2. Record 类型(预览功能)

       3. Switch 表达式-标准化

       4. 改进 NullPointerExceptions提示信息

       5. 其他特性

       Java 新特性

       1. EdDSA 数字签名算法

       2. Sealed Classes(封闭类,预览)

       3. Hidden Classes(隐藏类)

       4. Remove the Nashorn JavaScript Engine

       5. Reimplement the Legacy DatagramSocket API(重新实现DatagramSocket API)

       6. 其他参考与感谢

JDK基础概念及目录结构

       JDK、JRE和JVM等基础概念

       我们平时所说的JDK,实际上是指Java开发包,它包含了用于Java开发的工具集。具体来说,JDK(Java Development ToolKit)包含Java运行环境(JRE)和一系列开发工具,如编译器、调试器、javadoc等。我们依赖JDK来开发和运行Java程序。JDK的编译器Javac会将Java代码编译成字节码(.class文件)。由于编译出的字节码在任何平台上都相同,因此Java语言被誉为跨平台语言,即“一次编写,到处运行”。JRE(Java Runtime Environment)为Java提供了运行环境,怎么编译android源码其中JVM(Java Virtual Machine,即Java虚拟机)是关键部分,它负责将字节码解释成可执行的机器码。JRE由JVM、Java运行时类库、动态链接库等组成。JVM可以视为一台抽象化的计算机,拥有完整的体系架构,包括处理器、堆栈、寄存器等。在运行时环境,JVM会将Java字节码解释成机器码。由于机器码与平台相关,因此JVM在不同平台有不同的实现。目前,JDK默认使用的实现是Hotspot VM。

       OpenJDK介绍

       我们通常所说的JDK是指SUN公司(现在是Oracle公司的)的官方JDK,由于历史遗留问题,其本身采用的并非开源协议。因此,后来出现了OpenJDK,即JDK的开源版本。OpenJDK与JDK有以下几点不同:

       (以上摘自知乎中的高票答案。)我们有时会在Java源码中看到标记为native的方法,这说明该方法是用C代码实现的。我们可以通过OpenJDK查看其具体实现方式。debian 驱动源码在哪例如,Object类的getClass方法:

       相应的,在OpenJDK/jdk/src/share/native目录下,找到Object.c文件,可以看到具体的实现代码:

       JDK目录结构

       那么,上述提到的JRE和JVM具体是什么样子呢?我们可以通过查看JDK的目录结构来了解其真容。以下以centos7系统下的JDK1.8版本为例,对JDK目录结构进行说明。

       JDK1.8目录结构:

       以下是一些比较重要的目录或文件的含义:

       dt.jar和tools.jar文件作用

       dt.jar包含了Swing包,是运行环境的类库。目前的发展趋势是Java越来越少用于GUI开发,因此这个类库基本不会用到。

       tools.jar是工具类库,bin目录下的可执行程序,很多都会用到这个类库。例如,javac[.exe]、javadoc[.exe]等。

       平时我们经常会将这两个文件配置到CLASSPATH的当前目录(.)后面。原因是有一些可执行程序在运行时依赖于这些类库,例如javac[.exe]就依赖于tools.jar类库的javac包。

       jre目录结构

       bin目录包含了运行Java程序所需的可执行文件,例如java[.exe]。

       lib目录包含了运行时依赖的Java类库和动态链接库(.so或.dll或.dylib)。

       jre/lib目录结构:

       amd目录下包含了程序运行所需的动态链接库,在amd/server目录下,可以找到JVM库:libjvm.so。maven 指定源码目录rt.jar文件是Java运行时类库,是我们用到最多的基础类库,包括java.lang、java.io、java.net、java.util等。

       java.lang:Java语言包,该包下的文件不需要显式import。包括:Object类、数据类型相关的类(String、Long、Byte)、Class类、线程相关类Thread、异常类Throwable等。

       java.io:I/O操作相关的类。包括:文件类File、FileReader、FileWriter、输入输出流InputStream/OutputStream等。

       java.net:网络相关类。包括:http连接类HttpURLConnection、socket类等。

       java.util:工具类。包括:数据结构相关的类ArrayList、HashMap、日期类Date、随机数类Random等。

       我们平时在配置好JDK HOME后,IDE会默认将JDK的类库全部引用进来,供开发使用。以mac下的Itellij IDEA为例,看一下都有哪些类:

       后记

       本文首先介绍了JDK相关的一些基础概念;之后通过分析JDK的目录结构,加深对这些概念的理解。Java体系博大精深,像Java类库、JVM等每个部分都值得深入研究一番。阅读源代码是最直接、见效最快的方法,强烈推荐用这种方法来学习Java。

APP测试练手笔记(1)代码保护与应用配置

       深入探讨移动应用安全测试的关键步骤与关注点,以确保用户的隐私与数据安全。当前,移动应用的普及使得我们的日常活动与之紧密相连,从约会到支付,一个应用往往承载着大量的用户数据。因此,评估应用的安全性变得至关重要。本文旨在提供一个清晰的框架,指导如何在移动应用中进行安全测试,以识别潜在的安全漏洞并采取相应的预防措施。

       移动应用安全测试关注点包括敏感数据暴露、鉴权机制缺陷、钓鱼劫持风险、代码层面保护不足、应用配置错误、XcodeGhost病毒以及开发者证书不规范等问题。这些关注点构成了一个全面的安全测试流程,帮助开发者识别并修复潜在的安全隐患。

       ### 代码与应用配置方面的问题

       代码保护不足,可重新编译打包:通过使用ApkTool进行反编译,修改源代码,重新编译和签名,来测试应用的完整性。若发现可以注入恶意代码或绕过鉴权,应修改程序安装后 classes.dex 文件的 Hash 值,以判断软件是否被重新打包并进行提示。

       allowbackup权限数据泄露风险:检查AndroidManifest.xml文件中allowBackup属性是否设置为true,若存在,可能导致数据泄露。建议将android:allowBackup属性设置为false,防止数据泄漏。

       Debuggable属性应用信息篡改泄露风险:检查Debuggable属性是否设置为true,允许设置断点控制程序执行。若开启,应关闭此属性以防止应用信息被篡改。

       信任所有证书漏洞:检查SDK是否存在安全问题,如直接选择信任所有证书,可能导致中间人攻击和劫持。应升级SDK或使用SSLSocketFactory.STRICT_HOSTNAME_VERIFIER进行验证。

       开发者证书规范测试:确保证书满足规范性要求,检查是否过期。使用JEB CA查看页面或java JDK自带的keytool工具进行验证。

       ### 应用配置错误

       关键页面钓鱼劫持风险:确保敏感界面如登录、支付等是否受到钓鱼劫持保护,如提示用户等。在关键类的onpause中实现钓鱼劫持防护功能。

       ### WebView漏洞

       WebView接口函数addJavascriptInterface可能导致本地JS与Java交互漏洞,需检查版本限制和过滤措施。对于Android 4.2及之后版本,使用@JavascriptInterface注解代替addjavascriptInterface。

       ### 不安全的本地存储

       检查Shared Preferences、SQLite数据库和SD卡目录,确保敏感数据经过加密处理,防止数据泄露。

       ### 边信道信息泄露

       通过日志文件分析,加密存储密码等敏感信息,并对敏感信息的缓存进行加密,防止通过边信道被攻击者利用。

       本文以诱导充钱的约炮APP为例,详细介绍了在代码保护与应用配置方面进行安全测试的关键步骤与关注点。通过实施上述测试流程,可以有效识别并修复移动应用中的安全漏洞,增强应用的安全性和用户信任度。

Netty源码探究1:事件驱动原理

       Netty源码探究1:事件驱动原理

       Netty借鉴了Reactor设计模式,这是一种事件处理模式,用于管理并发服务请求。在模式中,服务处理器对请求进行I/O多路复用,并同步分发给相应的请求处理器。Netty的核心内容是Reactor,因此深入分析其在Netty中的应用至关重要。Netty吸收了前人优秀经验,构建出这款优秀的技术框架。

       在Reactor设计模式中,Demultiplexer和Dispatcher是关键概念。Netty中的Demultiplexer是如何实现的?答案在于其Server端的架构设计。Netty通过Bootstrap(ServerBootstrap也适用)来构建Server,其中bind方法是启动Reactor运行的关键。在bind方法中,Netty创建并注册Channel到EventLoopGroup,从而实现Demultiplexer的功能。

       Netty中的Channel与JDK中的Channel有何不同?Netty通过NioServerSocketChannel构建Server,其内部封装了Java NIO的Channel,但Netty的Channel与JDK中的Channel在注册到Selector时有所不同。Netty中的Channel注册到NioEventLoop中的Selector上,只关注OP_ACCEPT事件。当客户端连接时,事件被触发,Server响应客户端连接。这涉及NioServerSocketChannel的构造过程和Selector的创建。

       Dispatcher在Java NIO中负责事件分发,Netty中如何实现这一功能?在NioEventLoop中,Selector.select()方法配合run()函数,共同实现事件监听循环。run函数中包含事件状态机和事件分派逻辑。当有事件到来时,状态机触发processSelectedKeys()方法,根据事件类型调用相应处理器进行处理。

       Netty中的事件驱动原理最终如何与自定义handler关联?在NioEventLoop的processSelectedKey()方法中,事件处理逻辑与Channel.Unsafe接口相关联。Channel.Unsafe接口用于封装Socket的最终操作,Netty通过此接口与业务层Handler建立关联。通过调用handler的read方法,Netty将事件与业务处理逻辑关联起来。

       总之,Netty通过Reactor设计模式实现了事件驱动原理,借助Demultiplexer和Dispatcher的机制,实现了对并发请求的高效处理。理解Netty的源码结构和事件驱动原理,对于深入掌握Netty技术框架至关重要。