新闻资讯

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻资讯列表

socket阻塞和非阻塞如何设置,socket阻塞和非阻塞区别

发布时间:2023-09-18 08:50:45

socket阻塞和非阻塞如何设置

在使用socket进行网络通讯时,可以设置socket为阻塞或非阻塞模式。
阻塞模式下,当履行socket的读取和写入操作时,如果没有数据可读或没法立即写入数据,当前线程会被阻塞,直到有数据可读或可以写入数据。
非阻塞模式下,当履行socket的读取和写入操作时,如果没有数据可读或没法立即写入数据,当前线程不会被阻塞,而是立即返回一个毛病码,然后可以通过不断地轮询socket状态来判断是否是有数据可读或可以写入数据。
要设置socket为非阻塞模式,可使用`socket.setblocking(False)`方法来实现。该方法接受一个布尔值参数,设置为False表示将socket设置为非阻塞模式。要设置回阻塞模式,可使用`socket.setblocking(True)`。
下面是一个简单的示例代码,演示怎样设置socket为非阻塞模式:
```python
import socket
# 创建一个TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 将socket设置为非阻塞模式
sock.setblocking(False)
# 连接到服务器
sock.connect(('www.example.com', 80))
# 发送数据
sock.send('GET / HTTP/1.1 Host: www.example.com ')
# 接收数据
data = ''
while True:
try:
chunk = sock.recv(1024)
if not chunk:
break
data += chunk
except socket.error:
pass
# 关闭socket
sock.close()
# 打印接收到的数据
print(data)
```
在这个示例中,通过`sock.setblocking(False)`将socket设置为非阻塞模式,然后在接收数据时通过捕获socket.error异常来处理非阻塞模式下的毛病码。