套接字 Python 连接

Posted

技术标签:

【中文标题】套接字 Python 连接【英文标题】:Sockets Python Connection 【发布时间】:2012-04-29 12:13:31 【问题描述】:

我正在使用套接字在 Python 中编写客户端/服务器软件。

我有一个问题,专门针对 TCP/IP 和 Socket 模型:

我在我的服务器端使用这个代码示例(Python 中的服务器端程序):

import socket
# Create a TCP/IP socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Prevent from "address already in use"
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind the socket to port
server_address = ("localhost", 5000)
server.bind(server_address)

# Listen for connections
server.listen(5)

# Wait for on incomming connection
read = connection.recv(1024)
print "Received: ",read

一切都很好,但我有一些概念性问题:

1) 启用这种通信的最佳做法是什么?我是否必须为 CLIENT 和 SERVER 程序之间的 TCP/IP 设置心跳流量?我看到即使我让客户端程序没有流量(空闲)与服务器,当我回来并发送另一条消息(连接建立后的很多分钟和几分钟)时,消息仍然存在。这是正常行为吗?

2) TCP/IP 栈甚至“socket 模块”有什么TIMEOUT 功能?!?!我可以控制谁使用 socket 模块在 Python 中丢失了我们的“超时”连接?

感谢所有人!

【问题讨论】:

【参考方案1】:

在 TCP 中,不需要心跳来保持连接处于活动状态。只要两个端点仍然健康,连接就会一直存在。

不过,检测信号可用于及早检测故障。否则,只有在您尝试发送数据(或期望另一端发送数据)时,您才会发现连接是否仍然存在。在许多情况下,这已经足够了。但是对于某些(例如 IRC 应用程序),您希望在客户端关闭后尽快知道,以便您可以通知其他人他们已从频道中删除。

您也许可以使用SO_KEEPALIVE 套接字选项自动发送心跳包,但我没有这方面的经验。 This question 可能会有所帮助。

对于超时,请使用SO_RCVTIMEOSO_SNDTIMEO 套接字选项。请参阅man 7 socket 和Python socket documentation 了解更多信息。

【讨论】:

Tks Thomas,所以 TCP/IP 模型不会产生心跳流量?只要端点保持连接,连接就会保持打开状态?!?! 更新了相关问题的链接。

以上是关于套接字 Python 连接的主要内容,如果未能解决你的问题,请参考以下文章

套接字 Python 连接

Python套接字没有正确关闭连接

Python - 如何检查套接字是否仍然连接

python多线程和套接字连接问题

Python套接字子进程连接一段时间后没有回复

健壮的连续 TCP 连接(python 套接字)