Winsockt的TClientSocket设置ClientType的属性为ctNonBlocking.则通讯模式为非阻塞模式。
ctBlocking为阻塞模式,这里说一下阻塞与非阻塞的一些区别。
ctBlocking模式当客户端请求数据后,线程阻塞不继续执行,直到服务端返回数据,客户端将据需执行,并读取数据。
然而阻塞模式的缺陷还是比较大的,经常会使程序死掉或者假死。当服务端发送较大的文件时,阻塞模式基本废掉了,由于数据缓冲较小,不能及时的获取数据,阻塞模式将会认为数据发送完毕,会断掉服务连接,导致数据传送失败。因此阻塞模式比较适用于网络通畅,并且数据量小的情况。
 
非阻塞模式当客户端发送连接请求,及open之后,并不会执行之后的请求,就算有请求的数据也不会发送,而是会执行connect和write这两个事件,中间应该还有connecting事件。connect是连接成功后的事件,write是准备发送请求的事件。我们所有的发送请求都会在write事件里面执行。当我们在write事件中执行后,会调用read事件,在read事件中我们将会接受到服务端发送的数据,如果数据量比较大,则会一直调用read事件,直到数据发送完毕。非阻塞模式适合数据量较大的情况。
 
阻塞模式与非阻塞模式区别还是较大,但是根据我个人观点,非阻塞模式相对与阻塞模式有更大的优势,无论是性能,还是数据完整性方面的都较好。因此在我开发时也是使用非阻塞的模式。