关闭UDP Socket后如何重新开启?
解决UDP Socket关闭后重新开启的问题
嘿,我来帮你搞定这个UDP Socket的问题~
首先得明确一个关键点:当你调用sock.close()之后,这个socket对象就彻底失效了,没法直接“重新开启”它。UDP和TCP在这一点上是一样的——关闭后的socket不能再被复用,你得重新创建一个新的socket实例才行。
为什么你用connect()会报错?
你提到以为connect()是TCP专属的,其实UDP也支持这个方法,但它的作用和TCP完全不同:
- TCP的
connect()是和服务器建立双向连接; - UDP的
connect()只是帮你绑定一个固定的目标地址,之后用send()发送数据时就不用每次都指定(host, port)了,本质上还是无连接的通信。
你报错的原因是已经关闭的socket对象不能再调用任何方法(包括connect()),因为它已经被系统释放了。
正确的重新使用UDP Socket的步骤
直接上示例代码,一看就懂:
import socket # 第一次创建并使用UDP Socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(b"Hello UDP", ("127.0.0.1", 8080)) sock.close() # 关闭旧socket # 重新开启的正确方式:创建一个新的socket实例 new_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 如果需要固定目标地址,现在可以用connect(注意是新的socket对象) new_sock.connect(("127.0.0.1", 8080)) new_sock.send(b"Hello again UDP") # 因为已经connect,所以直接用send new_sock.close()
额外小提示
如果你需要频繁发送UDP数据,其实可以不用每次都关闭socket——保持socket活跃,重复发送数据就行,只有当你确定不再需要这个socket的时候再调用close()。这样能避免频繁创建销毁socket的开销。
内容的提问来源于stack exchange,提问作者Benke Boldizsár Hargitai




