套接字的shutdown与close

这是以前的一篇记录,当时在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端向外发送数据的通道
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值