手机随时阅读
新人专享大礼包¥24
简介GridView是一个网格化的布局,如果在填充的过程中子组件超出了展示的范围的时候,那么GridView会自动滚动。因为这个滚动的特性,所以GridView是一个非常好用的Widget。今天我们一起来探索一下GridView这个layout组件的秘密。GridView详解GridView是一个可滚动的view,也就是ScrollView,事实上GridView继承自BoxScrollView:
简介之前我们讲到了如何在netty中构建client向DNS服务器进行域名解析请求。使用的是最常见的TCP协议,也叫做Do53/TCP。事实上除了TCP协议之外,DNS服务器还接收UDP协议。这个协议叫做DNSoverUDP/53,简称("Do53")。本文将会一步一步带领大家在netty中搭建使用UDP的DNS客户端。搭建netty客户端因为这里使用的UDP协议,netty为UDP协议提供了专门
简介一般情况下我们使用的证书都是由第三方权威机构来颁发的,如果我们有一个新的网站,我们需要申请一个世界范围内都获得认可的证书,这样我们的网站才能被无障碍的访问。如果在某些情况下,我们的网站或者系统并不是公开的,但是也需要使用tls协议的话,那么就需要自己搭建一个CA服务器。这样的CA服务器就叫做privateCA。熟悉证书的朋友可能会说了,为什么不使用自签名证书呢?也可以达到安全通信的目
简介DNS的全称domainnamesystem,既然是一个系统就有客户端和服务器之分。一般情况来说我们并不需要感知这个DNS客户端的存在,因为我们在浏览器访问某个域名的时候,浏览器作为客户端已经实现了这个工作。但是有时候我们没有使用浏览器,比如在netty环境中,如何构建一个DNS请求呢?DNS传输协议简介在RFC的规范中,DNS传输协议有很多种,如下所示:DNSoverUDP/53简称"Do5
简介在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。epoll的详细使用epoll的使用也很简单,我们还是以常用的聊天室为例来讲解epoll的使用。对于server端来说需要创建bossGroup和workerGroup,在N
简介在前面的章节中,我们介绍了在netty中可以使用kequeue或者epoll来实现更为高效的native传输方式。那么kequeue和epoll和NIO传输协议有什么不同呢?本章将会以kequeue为例进行深入探讨。在上面我们介绍的native的例子中,关于kqueue的类有这样几个,分别是KQueueEventLoopGroup,KQueueServerSocketChannel和KQueu
简介对于IO来说,除了传统的blockIO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。我们也知道在IO中有比NIO更快的IO方式,比如kqueue和epoll,但是这两种方式需要native方法的支持,也就是说需要在操作系统层面提供服务。如果我们在支持Kqueue或者epoll的服
简介之前我们介绍了一个非常优秀的细粒度控制JAVA线程的库:javathreadaffinity。使用这个库你可以将线程绑定到特定的CPU或者CPU核上,通过减少线程在CPU之间的切换,从而提升线程执行的效率。虽然netty已经够优秀了,但是谁不想更加优秀一点呢?于是一个想法产生了,那就是能不能把affinity库用在netty中呢?答案是肯定的,一起来看看吧。引入affinityaffinity
简介定时器是一种在实际的应用中非常常见和有效的一种工具,其原理就是把要执行的任务按照执行时间的顺序进行排序,然后在特定的时间进行执行。JAVA提供了java.util.Timer和java.util.concurrent.ScheduledThreadPoolExecutor等多种Timer工具,但是这些工具在执行效率上面还是有些缺陷,于是netty提供了HashedWheelTimer,一个优化
简介前面讲到了memcached的文本协议,虽然文本协议看起来非常简单,但是对于客户端来说一般还是会选择效率更高的二进制协议。二进制协议的本质和文本协议是一样的,只是他们的表现方式不同而已。本文将会详细介绍memcached中二进制协议的实现细节。memcached的协议包对于memcached的请求包和响应包来说,除了请求头有所区别之外,其他的格式都是一样的。所以对memcached的请求和响应
简介我们已经介绍了haproxy提出的proxyprotocol协议,通过proxyprotocol协议,服务器端可以获得客户端的真实IP地址和端口,从而可以进行一些非常有意义的操作。为什么获得客户端的真实IP地址会非常有意义呢?考虑一个藏在proxy背后的数据库,如果有多个客户端通过proxy进行数据库的连接,事实上因为都是通过代理进行连接,所以数据库中的所有的操作都是proxy服务器的IP地址
简介很多人都用过java中的枚举,枚举是JAVA1.5中引用的一个新的类型,用来表示可以列举的范围,但是可能很少有人知道java中的enum到底是怎么工作的,enum和Enum有什么关系?Enum可不可以扩展?一起来看看吧。enum和EnumJAVA1.5中引入了枚举类,我们通常使用enum关键字来定义一个枚举类:publicenumStatusEnum{START(1,"start"),INPR
简介JDK中的ThreadLocal可以通过get方法来获得跟当前线程绑定的值。而这些值是存储在ThreadLocal.ThreadLocalMap中的。而在ThreadLocalMap中底层的数据存储是一个Entry数组中的。那么从ThreadLocalMap中获取数据的速度如何呢?速度有没有可以优化的空间呢?一起来看看。从ThreadLocalMap中获取数据ThreadLocalMap作为一
简介用过缓存系统的肯定都听过memcached的大名,memcached是一个非常优秀的分布式内存缓存系统,应用非常的广泛。Memcached不仅仅是Web缓存,它更是一个通用的数据缓存,基本上你可以将任何东西存入memcached中,它的分布式设计具有很好的可扩展性和灵活性。Memcached是一个客户端服务器端的架构模式。一般来说,在服务器上搭建好Memcached的服务器端,接下来就可以使用
简介代理大家应该都很熟悉了,比较出名的像是nginx,apacheHTTPD,stunnel等。我们知道代理就是代替客户端向服务器端进行消息请求,并且希望在代理的过程中保留初始的TCP连接信息,例如源和目标IP和端口等,以提供一些个性化的操作。一般情况下,为了实现这个目标,有一些现成的解决办法,比如在HTTP协议中,可以使用“XForwardedFor”标头,来包含有关原始源地址,还有"XOrig
简介JDK中的Thread大家肯定用过,只要是用过异步编程的同学肯定都熟悉。为了保存Thread中特有的变量,JDK引入了ThreadLocal类来专门对Thread的本地变量进行管理。ThreadLocal很多新人可能不明白ThreadLocal到底是什么,它和Thread到底有什么关系。其实很简单,ThreadLocal本质上是一个key,它的value就是Thread中一个map中存储的值。
简介netty中提供的protobuf编码解码器可以让我们直接在netty中传递protobuf对象。同时netty也提供了支持UDP协议的channel叫做NioDatagramChannel。如果直接使用NioDatagramChannel,那么我们可以直接从channel中读写UDP对象:DatagramPacket。但是DatagramPacket中封装的是ByteBuf对象,如果我们想要
简介在之前的文章中我们讲过了,jbossmarshalling是一种非常优秀的java对象序列化的方式,它可以兼容JDK自带的序列化,同时也提供了性能和使用上的优化。那么这么优秀的序列化工具可不可以用在netty中作为消息传递的方式呢?答案当然是肯定的,在netty中一切皆有可能。netty中的marshallingprovider回顾一下jbossmarshalling的常用用法,我们需要从Ma
简介在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外,还有一些第三方的产品可以实现对JAVA对象的序列化。其中比较有名的就是Googleprotobuf。当然,也有其他的比较出名的序列化工具,比如Kryo和JBossMarshalling。今天想给大家介绍的就是JBossMarshalling,为什么要介绍JBossMarshalling呢?用过google
简介我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。这样就可以调用JDK自身的对象对象方法,进行对象的读写。那么在netty中进行对象的传递可不可以直接使用JDK的对象序列化方法呢?如果不能的话,又应该怎么处理呢?今天带大家来看看netty中提供的对象编码器。什么
简介要讲网络协议,肯定离不开OSI(OpenSystemInterconnection)的七层模型。我们一般关注的是网络层之上的几层,比如IPV4IPV6所在的网络层,TCPUDP所在的传输层,HTTPFTP所在的应用层等。今天要讲的sctp协议,全称是StreamControlTransmissionProtocol,翻译成中文就是流控制传输协议。是由IETF在RFC4960中提出的。传输层已经
简介在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行frame拆分,每个frame包含一个完整的xml。另一方面是将分割好的frame进行xml的语义解析。进行frame拆分可以使用
简介字符串是我们程序中最常用到的消息格式,也是最简单的消息格式,但是正因为字符串string太过简单,不能附加更多的信息,所以在netty中选择的是使用byteBuf作为最底层的消息传递载体。虽然底层使用的ByteBuf,但是对于程序员来说,还是希望能够使用这种最简单的字符串格式,那么有什么简单的方法吗?netty中的字符串编码解码器为了解决在netty的channel中传递字符串的问题,nett
简介在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核。为了充分利用现代CPU的功能,JAVA中引入了多线程,不同的线程可以同时在不同CPU或者不同CPU核中运行。但是对于JAVA程序猿来说创建多少线程是可以自己控制的,但是线程到底运行在哪个CPU上,则是一个黑盒子,一般来说很难得知。但是如果是不同CPU核对同一线程进行调度,则可能会出现CPU切换造成的性能损失。一般情况下这种损失是比较
简介什么是callback呢?简单点说callback就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到callback了。最有可能看到callback的语言就是javascript了,基本上在javascript中,callback无处不在。为了解决callback导致的回调地狱的问题,ES6中特意引入了promise来解决这个问题。为了方便和n
简介前面我们讲到了JNA中JAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native中的数据类型是复杂的struct类型该如何进行映射呢?不用怕,JNA提供了Structure类,来帮助我们进行这些映射处理。native中的struct什么时候会用到struct呢?一般情况下,
简介在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interfacemapping,第二种是directmapping。虽然两种方式不同,但是在具体的方法映射中,我们都需要在JAVA中定义一个和native方法进行映射的方法。而这个JAVA中的映射在JNA中就是一个function。通过或者function对象,我们可以实现一些非常强大的功能,
简介我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer。除了Pointer之外,JNA还提供了更加强大的Memory类,本文将会一起探讨JNA中的Pointer和Memory的使用。PointerPointer是JNA中引入的类,用来表示native方法中的指针。大家回想一下native方法中的指针到底是什么呢?native方法中的指针实际上就是一个地址,这个地址
简介在netty中我们需要传递各种类型的消息,这些message可以是字符串,可以是数组,也可以是自定义的对象。不同的对象之间可能需要互相转换,这样就需要一个可以自由进行转换的转换器,为了统一编码规则和方便用户的扩展,netty提供了一套消息之间进行转换的框架。本文将会讲解这个框架的具体实现。框架简介netty为消息和消息之间的转换提供了三个类,这三个类都是抽象类,分别是MessageToMess
简介相信每个程序员都有一个成为C大师的梦想,毕竟C程序员处于程序员鄙视链的顶端,他可以俯视任何其他语言的程序员。但事实情况是,无数的程序员从小白到放弃,鉴于C的难度,最后都投入了java的怀抱。JAVA以他宽广的胸怀接纳了一众无法登顶C的程序员。开个玩笑,C和C的优势在于和系统底层的交互和其运行的速度和效率,JAVA的优势在与广泛的应用框架,可以快速搭建所需的应用程序。两者各有所长。框架的好处就是
Copyright © 2005-2022 51CTO.COM 版权所有 京ICP证060544号