1、Socket又称套接字
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器,Socket是创建网络链接时使用的,不论是Socket仍是ServerSock它们的工做都是经过SocketImp类及其子类完成的。
套接字之间的链接过程能够分为四个步骤:服务器监听,客户端请求服务器,服务器确认,客户端确认,进行通讯。
IO(BIO)和NIO的区别:其本质就是阻塞和非阻塞的区别。
阻塞概念:应用程序在获取网络数据的时候,若是网络传输数据很慢,那么程序就一直等待,直到传输完毕为止。
非阻塞概念:应用程序直接能够获取已经准备就绪好的数据,无需等待。
BIO为同步阻塞形式,NIO为同步非阻塞形式。NIO并无实现异步。jdk1.7以后,升级NIO包,支持异步非阻塞通讯模型即NIO2,,0
同步与异步:同步和异步通常是面向操做系统与应用程序对IO操做的层面上来区别的。
同步时,应用程序会直接参与IO读写操做,而且咱们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪:或者采用轮询的策略实时检查数据的就绪状态,若是就绪则获取数据。
异步时,则全部的IO读写操做交给操做系统处理,与咱们的应用程序没有直接关系,咱们程序不须要关心IO读写,当操做系统完成了IO读写操做时,
会给咱们应用程序发送通知,咱们的应用程序直接拿走数据便可。java
2、netty实现通讯的步骤:
1.建立两个的NIO线程组,一个专门用于网络事件处理,另外一个则进行网络通讯读写。
2.建立一个ServerBootstrap对象,配置netty的一系列参数,例如接受传出数据的缓存大小等。
3.建立一个实际处理数据的类Channellenitializer,进行初始化的准备工做,好比设置接受传出数据的字符集。格式。已经实际处理数据的接口。
4.绑定端口,执行同步阻塞方法等待服务器端启动便可。
3、服务端:ctx.writeAndFlush(Unplooled.copiedBuffer(response.getBytes())).
addListener(ChannelFutureListener.CLOSE);发一次关闭一次至关于短链接,若是不关闭就至关于长链接(没有add)。
4、能够开启多个端口
b.bind(8765).sync();
b.bind(8766).sync();
可是处理的能力没加强,增长了接受能力。
web
5、TCP粘包、拆包的问题
TCP是一个流协议,所谓流就是没有界限的遗传数据。在业务上,咱们一个完整的包可能会被TCP分红多个包进行发送,也可能把多个小包封装成一个大的数据包发送出去,这就是所谓的TCP粘包、拆包的问题。
分析TCP拆包问题产生的缘由:
1.应用程序write写入的字节大小大于套接口发送缓存区的大小。缓存
2.进行MSS大小的TCP分段
3.以太网帧的payload大于MTU进行IP分片
解决方案:
1.消息定长,例如每一个报文的大小固定为200个字节,若是不够,空位补空格。
2.在包尾增长特殊字符进行分割,例如回车等。
3.将消息分为消息头和消息体,在消息头中包含表示消息总长度的字段,而后进行业务逻辑的处理。
netty如何去解决粘包、拆包的问题:
分隔符类DelimiterBasedFrameDecoder(自定义分隔符)
FixedLengthFrameDecoder(定长)
netty自定义协议服务器
netty udp websocket
netty最佳实践
一是数据通讯:考虑两台机器(甚至多台)使用netty的怎样进行通讯,我的认为如下三种:
1.使用长链接通道不断开的形式进行通讯,也就是服务器和客户端的通道一直处于开启状态,若是服务器性能足够好,而且咱们的客户端数量也比较少的状况下,我仍是比较推荐的,
2.一次性批量提交数据,采用短链接方式,也就是咱们会把数据保存在本地临时缓存区或者临时表里,当达到临界值进行一次性批量提交,又或者根据定时任务轮询提交,这种
状况弊端是作不到实时性传输,在对实时性不高的应用程序中能够推荐使用。
3.咱们能够一种特殊的长链接,在指定某一时间以内,服务器与某台客户端没有任何通讯,则断开链接。下次链接则是客户端向服务器发送请求的时候,再次创建链接。可是这种模式咱们须要考虑2个因素:
如何在超时后关闭通道?关闭通道后咱们又如何再次创建链接?
客户端宕机时,咱们无需考虑,下次客户端重启以后咱们就能够与服务器创建链接,可是服务器宕机时,咱们的客户端如何与服务器进行链接呢?
websocket