这是以前的一篇记录,当时在shutdown与close中没有加入例子,这篇文章是一篇补充
### server.py
import socket
import traceback
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # tcp
sock.setblocking(True)
sock.bind(('127.0.0.1', 8008))
sock.listen()
while True:
try:
client, addr = sock.accept()
data = client.recv(1024)
client.shutdown(socket.SHUT_RD) # 关闭读(SHUT_RD)的半连接
n = 0
while data:
print(data, addr)
data = client.recv(1024) # 再次recv时会报错
n += 1
if n == 3:
break
client.send(b'worlddd')
except:
traceback.print_exc()
pass
### client.py
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 8008))
while True:
sock.send(b'hello world')
分别运行上面的server.py与client.py,可以发现在server.py在接收一次后,就无法接收了,因为对于server来说,它的读通道被关闭了。
将server.py的shutdown参数换成socket.WR
### server.py
import socket
import traceback
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # tcp
sock.setblocking(True)
sock.bind(('127.0.0.1', 8008))
sock.listen()
while True:
try:
client, addr = sock.accept()
data = client.recv(1024)
client.shutdown(socket.SHUT_WR) # 关闭写(SHUT_WR)的半连接
n = 0
while data:
print(data, addr)
data = client.recv(1024)
n += 1
if n == 3:
break
client.send(b'worlddd') # WR半连接被关闭后,无法向client端发送消息了
except:
traceback.print_exc()
pass
此时再次运行server.py和client.py,则可以发现在server端接收了3次后,无法向client端发送数据。
可以得出结论:
- 服务端关闭RD(read)通道,则server端无法接收客户端发过来的数据
- 关闭WR(write)通道,无法阻止server端接收数据,但是可以关闭server端向外发送数据的通道