Netty为什么传输快

HTTP服务器的原理:

  1  创建一个ServerSocket,监听并绑定一个端口
  2  一系列客户端来请求这个端口
  3  服务器使用Accept,获得一个来自客户端的Socket连接对象
 
  4  启动一个新线程处理连接
       1) 读Socket,得到字节流
       2) 解码协议,得到Http请求对象
       3) 处理Http请求,得到一个结果,封装成一个HttpResponse对象
       4) 编码协议,将结果序列化字节流
       5) 写Socket,将字节流发给客户端
 
  5  继续循环步骤3

HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议,如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。

使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器。

NIO速度优于BIO的原因:

1,在BIO中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,
而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。

2,而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,
Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理
完数据再返回给客户端——这个过程是阻塞的,这样就能让一个Thread处理更多的请求了。

Netty为什么传输快

Netty的传输快其实也是依赖了NIO的一个特性——零拷贝。我们知道,Java的内存有堆内存、栈内存和字符串常量池等等,
其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,
中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。
Netty针对这种情况,使用了NIO中的另一大特性——零拷贝,当他需要接收数据的时候,他会在堆内存之外开辟一块内存,
数据就直接从IO读到了那块内存中去,在netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。

猜你喜欢

转载自blog.csdn.net/qq_32445015/article/details/102398636
今日推荐