tcp套接字函数中不会产生阻塞?
简单,服务器端启动进程,内部函数socket创建一个设计和实现tcp协议的流套接字描述符。其次,服务进程动态创建bind其它名字套接字,将套接字描述符帐号绑定到本地地址和本地端口上。又一次,服务器端内部函数listen,又开始侦听客户端的socket连接到请求。这一次阻塞,等到发来了客户端的connect请求,内部函数accept参与或则。但,不阻塞住bind和listen。
socketnetty区别?
socket那是为网络服务提供给的一种机制。
通讯机的两端也有sokcet。网络通讯其实那是sokcet间的通讯,数据在两个sokcet间实际io传输
netty是一个基于条件javanio类库的异步模式通信框架,它的架构特点是:异步运行非阻塞、实现事件驱动、集高性能、高可靠性和高可订制性
在非阻塞模式上怎么知道recv接收数据完成?
以linux下tcpsocket编程为例:阻塞就是recv/read的时候socket收不到缓冲区如果这样有数据就读,没数据我就总是睡觉时候死赖着不走,直到此时有数据跑来读完我才走。
expect/write的时候,就算发送缓冲区满了,没有空间再继续发送中了我也始终晚上睡觉赖着不肯走,等到邮箱里缓冲区腾出足够的空间让我把数据彻底塞到邮箱里缓冲区里我才走。
(当然如果你按照setsockopt设置里了读写已超时,连接超时时间到了肯定会回-1和eagain,并没有睡觉时候等待)
非阻塞那是recv/read的时候,如果这样接收缓冲区有数据我就继续读,没有数据我真接带了前往的-1和egain走人,绝不会睡耐心的等待误了时间。
write/send的时候,假如你的邮箱缓冲区有足够的空间,就当即把数据塞到邮箱里缓冲区去,接着转身走人,如果不是正在发送缓存区满了,空间将近,那直接跟着赶往的-1和eagain走人。不过io多路复用,简单要再理解的是,操作系统为我能提供了一个功能,当你的某个socket收得到缓存区有数据可读,的或发送中缓冲区有空间可写的时候,它也可以给你一个通知。
那样的话当配合非阻塞的socket使用时,唯有当系统通知我哪个描述符可读了,我才去先执行read操作,可以绝对的保证每次read都能读到最有效数据而不做纯直接返回-1和eagain的无用功。
写操作相似。
操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都这个可以而监视多个请看符的读写准备完成状况,这样,多个请看符的i/o操作都能在一个线程内完成,这就叫i/o多路复用,这里的“复用”指的是复用同一个线程。再说事件驱动,其实是i/o多路复用的一个另外的称呼。再说异步同步,我们最常见的linux下的网络编程模型大部分全是离线io,以读操作为例,本质上也是必须用户全局函数read/recv去从内核缓冲区把数据继续读再处理业务逻辑。
同步异步io则是内核已经把数据读行了,用户再处理逻辑。
异步运行io在linux下一般是用aio库。
原文标题:python socket 接收数据阻塞 tcp套接字函数中不会产生阻塞?,如若转载,请注明出处:https://www.bjtdsx.com/tag/22526.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「天地水秀」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。