0

我正在使用套接字在 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 中丢失了我们的“超时”连接?

谢谢大家!

4

1 回答 1

2

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

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

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

对于超时,请使用SO_RCVTIMEOSO_SNDTIMEO套接字选项。man 7 socket有关更多信息,请参阅Python 套接字文档

于 2012-04-29T12:51:09.647 回答