Netty学习一之基础知识

netty是异步的事件驱动网络应用框架,是可维护高效的客户端和服务端的应用框架

所有的rpc调用都会根据数据文件生成一个stub 和skeleton,stub是一个概念,客户端生成,skeleton由服务端生成

 

学习netty前环境的搭建,我们用gradle(类似于maven的工具,去gradle官网下载最新版本的,我家的电脑还是win7的,gradle修改环境变量后,用path命令查看没有起作用,下了一个老版本的就可以了,老版本的地址https://services.gradle.org/distributions/

具体怎么创建gradle项目参考博客https://blog.csdn.net/weixin_42425970/article/details/90677768

然后创建完gradle项目,我们在build.gradle文件中我们配置maven仓库为 阿里的仓库,然后配置需要的netty的jar包

repositories {

    maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
}

dependencies {
    compile (
            "io.netty:netty-all:4.1.10.Final"
    )
}

netty中常见的编程风格:是方法链的形式,一个对象的方法,返回的是这个对象的本身

netty 有哪些作用

netty我们可以充当一个http服务器,相当于tomcat,但是netty并没有servlet规范和管理servlet,netty比servlet更底层,效率更高,springstruts2,帮我们做了开发效率更高,而且netty的请求。路由也没有封装

netty 可以就行socket开发,是应用最广泛的应用

netty 可以支持长连接的开发,这样的好处,不仅客户端可以向服务器请求数据,服务端也可以主动的发送数据(过去的解决方案是;用http请求轮询的方式,但是有的时候请求的数据还没有http的header大,对性能资源是一种浪费)

 

* netty 的handler机制类似于过滤器一样,当请求过来时,会触发handler处理机制,先处理第一个handler,第一个处理完后,在处理第二个
* 直到最后一个handler处理完后,在原路返回,这种机制叫做责任链模式

netty的handler相关学习

//IdleStateHandler 是一个状态监测的处理器
        //第一个参数是服务端多长时间没有收到消息将会触发对应的事件
        //第二个参数是服务端多长时间没有发送消息,将会触发相应的事件
        //第三个参数表示的是服务端多长时间既没有读也没有写会触发的事件,第四个参数是时间单位
        pipeline.addLast(new IdleStateHandler(5,6,10, TimeUnit.SECONDS));
pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));//webSocekt服务器协议处理器
//这里的参数ws值得请求的path的路径,即ws://localhost:8080/ws 中的第二个ws,第一个ws是协议,是固定的

相关类的学习

// aggregator 表示聚合的意思,netty的请求是分段,把一个请求分为若干个段,HttpObjectAggregator这个类型的作用是将如干个段何为一个完整的http请求或者响应
        //当聚合的长度超过了设置的长度 这个类的handlerOverSize就会被调用
        pipeline.addLast(new HttpObjectAggregator(8192));

看懂netty注释

netty中的方法的学习

 

 

websocket诞生原因:

是和html5一起提出来的,是为了解决http致命的缺点,http是一个无状态的基于请求和响应的 传输协议,

无状态指的是:

相同的客户端第一次发送请求和第二次发送请求,没有能力去识别同一个客户端,cookie和session为了解决这些问题就诞生了

同一个客户端再次访问服务器,客户端就将同一个域下面的所有的cookie都发送到服务端

基于请求和响应的:请求和响应是建立在连接的基础上

一定是客户端发起请求,客户端给出相应,http1.0 当客户端收到服务端的相应后就会断开连接,如果是http1.1的特性,keepalive,当客户端和服务端建立好连接后,在一定的时间之内,客户端发出请求,服务端给出响应,在一定的时间内

如果客户端还会给服务端发送连接,客户端就会用已有的连接

如果用浏览器进行聊天,就要实现服务端将数据推送给客户端和需要长时间连接,http协议不允许

早期为了解决这个问题:出现了假长连接:用轮询的方式,即每隔一段时间就去请求服务端,但是这种不是事实的,需要下次轮询才能将数据发送给客户端,而且我们用轮询,大多是的请求是没有数据的,造成了资源和带宽的浪费,而且每次请求http协议的要求和规定,需要将请求头和请求内容发送过去,但是大多数服务端 不在乎请求的头,所以造成了带宽的浪费

websocket出现后,实现了长连接,一旦客户端和服务端建立连接后,双方就是一种对等的实体,服务端可以主动的向客户端发送数据,而且在第一次建立连接时会头连接发送过去,但是一旦建立连接后,就不会发送头信息,减少了网络带宽

 

websocket 是建立在http协议之上的一种升级版的协议,客户端首先要向服务端发起请求,这个请求是http请求,只不

消息的头中携带了websocket的请求,http连接一但连接之后,服务器读到websocket连接的请求,就会将http连接升级为websocket连接,连接一旦建立之后,就会是新客户端和服务端之间的双向数据传递

 

虽然websocket是html5规范的一部分,但是可以用于非浏览器,

 

netty的http请求:是分块或叫分段,将一个大的请求,分为若干个段,每个段读取

 

webSocket的协议通常是这种形式的:ws://server:port/context_path

//每一个连接都有一个id,每一个连接对应一个channel,每一个channel对应一个ChannelId,ChannelId对象中有连个方法,短id 不是全局唯一,长id是全局唯一的
System.out.println("handleradd: "+ctx.channel().id().asLongText());

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值