文章目录
Netty
Netty是一个提供了易于使用的API的客户端/服务器框架。
是一个异步的事件驱动网络应用框架,可以迅速开发高性能的服务端客户端
并发高 - NIO(非阻塞IO)
传输快 - 零拷贝
提供了很多API,简化了网络编程
零拷贝
数据从IO读取放到内存堆会经过一些缓冲区,数据拷贝两次,数据很大时造成资源浪费
而Netty接受数据或传输数据时开辟一个新的堆内存,数据就从IO读到新的堆内存中,加快了传输的速率
提供协议
- HTTP&WebSocket
- Socket&Datagram
- SSL . StartTLS
阻塞和非阻塞
线程访问资源,该资源是否准备就绪的一种处理方式
资源没有准备就绪
阻塞:线程会一直等待资源处理完毕,直到响应返回结果,线程处于阻塞不可以做任何事情
非阻塞:线程直接返回结果,不会持续等待资源处理完毕,会去请求别的资源
同步和异步
同步和异步是指访问数据的一种机制
同步:主动请求,并且等待IO操作完成后发送通知
异步:在一个线程中,主动请求数据后,可以去处理其他任务,可以发起其他请求,很多请求处理完毕之后,再逐一的通过异步的通知方式通知你
BIO
Block IO同步阻塞
IO在进行读写时,线程无法进行其他操作,并发处理能力低
服务器与客户端问一答方式,过程中频繁创建和销毁响应的线程
通过线程池改良,不再创建新的线程,也可以称之为伪异步IO
NIO
同步非阻塞IO,New IO(Non-Block IO)
通过Selector选择器,多路复用器,与多个客户端建立双向通道(Channel),进行数据读写到Block中。
AIO
异步非阻塞IO
异步阻塞IO
区别于同步,同步主动去请求,异步等待通知通知
Reactor线程模型
单线程模型:所有的IO操作都由同一个NIO线程处理的
多线程模型:由一组NIO线程处理IO操作
主从线程模型:一组线程池接受请求,一组线程池处理IO
Demo
Channel生命周期
WebSocket
实时通讯方式
- Ajax轮询
通过ajax异步地,浏览器每隔一段时间发送一个请求到后端,询问服务器有无数据更新,如有将数据拿到前端进行渲染,一直循环获得后端的数据,浏览器不需要一直刷新。 - Long pull
请求是阻塞模式,客户端访问服务器后,如果服务器没有响应,一直等待直到服务器返回response为止,只有返回后,客户端才会再次建立请求 - WebSocket
是基于Http的一种协议,(Http1.0不支持长连接),使用http协议完成一小部分握手,客户端发起请求到服务端,服务端找到对应的服务助理,服务助理与客户端一直保持链接,为客户端进行服务,并且可主动推送新的消息到客户端。
相对于Http协议这种非持久化的协议来说是一种持久化协议,Http协议request和response一一对应,服务器需要接收到客户端的request后才发送response给客户端。
而websocket一旦建立连接之后,服务端可以主动地一直推送消息给客户端,客户端不需要请求服务端。只需要建立一次http请求,就可以做到源源不断的信息的传递。
Demo
WebSocket API
连接后端
var socket = new WebSocket("ws://[ip]:[port]");
WebSocket前端的生命周期
- onopen()
客户端和服务端连接建立触发 - onmessage()
收到消息触发,服务端向客户端发送消息,只要发送消息就会在客户端的onmessage()里面接收 - onerror
后端出现异常,在后端主动关闭了服务器,在前端的onerror会接收到相应的错误事件 - onclose
客户端和服务端连接关闭触发
主动方法
- Socket.send() Socket.close()
FastDFS文件服务器
Linux下安装ssh,将下列文件通过filezilla传入linux中
配置tracker,storage,client
文件上传目录
安装gcc++,pcre,zlib和zlib-devel,ssl-devel
$ sudo apt-get install zlib1g
$ sudo apt-get install zlib1g.dev
$ sudo apt-get install apache2 ##安装Apache
$ sudo apt-get install openssl ##安装openssl
$ sudo apt-get install libssl-dev ##安装openssl开发库