TCP粘包,拆包及解决方法

在进行Java NIO学习时,发现,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。 我们都知道TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议。那么UDP是否会发生粘包或拆包的现象呢?答案是不会。UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;另外从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。 粘包、拆包表现形式 »

Java中BIO,NIO和AIO使用样例

上文中分析了阻塞,非阻塞,同步和异步概念上的区别以及各种IO模型的操作流程,本篇文章将主要介绍Java中BIO,NIO和AIO三种IO模型如何使用。需要注意的是,本文中所提到的所有样例都是在一个server对应一个client的情况下工作的,如果你想扩展为一个server服务多个client,那么代码需要做相应的修改才能使用。另外,本文只会讲解server端如何处理,客户端的操作流程可以仿照服务端进行编程,大同小异。文章最后给出了源码的下载地址。 BIO(Blocking I/O) 在Java中,BIO是基于流的,这个流包括字节流或者字符流,但是细心的同学可能会发现基本上所有的流都是单向的,要么只读,要么只写。在实际上编程时,在对IO操作之前, »

BIO,NIO和AIO模型介绍

在计算机的世界中,IO操作是不可避免的一个话题。 IO操作涉及到的阻塞,非阻塞,同步和异步这些概念常常让我感到混乱,为此,专门抽出时间对这些概念做了一下简单的研究,记录如下。希望可以帮助还在这些概念中挣扎的同学。 阻塞,非阻塞,同步和异步 IO操作实际上可以分为两步:发起IO请求和实际的IO操作。如果在第一步发起IO请求时发生阻塞,那么这个IO操作就可以说阻塞的,否则是非阻塞的。如果在第二步实际IO操作时发生阻塞,那么这个IO操作就是同步的,否则就是异步的。 换种说法,阻塞和非阻塞是指在用户程序查询IO就绪状态时(比如查询IO是否有数据),用户程序对IO不同的就绪状态所表现出来的不同形式。以读取数据为例,当IO没有数据可供读取时, »