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可以直接对这些数据进行直接操作,从而加快了传输速度。
![](https://img.haomeiwen.com/i18666969/1b8e9599359ab2e4.png)
![](https://img.haomeiwen.com/i18666969/3d41d16f413b5cf2.png)
谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!
网友评论