2012-04-29 159 views
0

我正在使用套接字在Python中编写客户端/服务器软件。套接字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)如何是ENAB的最佳实践这个通讯?我是否必须为CLIENT和SERVER程序之间的TCP/IP设置心跳流量?我看到,即使我离开客户端程序时没有与服务器通信(空闲),当我回来并发送另一条消息时(连接建立后很多分钟和几分钟)消息仍然消失。这是正常的行为吗?

2) TCP/IP协议栈或甚至“套接字模块”有任何TIMEOUT功能?!?!我可以使用套接字模块控制谁在Python中丢失了“超时”连接?

Tks for all!

回答

2

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

但是,心跳可以用于尽早检测故障。否则,只有当您尝试发送数据(或期望另一端发送数据)时才会发现连接是否仍处于活动状态。在很多情况下,这足够好。但是对于一些(比如IRC应用程序),您希望在客户端关闭后立即知道,以便可以通知其他人他们已从频道中删除。

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

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

+0

Tks托马斯,所以TCP/IP模型不会使心跳流量?只要端点保持连接状态,连接就会保持打开状态?!?! – StarkBR 2012-04-29 12:57:51

+0

已更新,并附有相关问题的链接。 – Thomas 2012-04-29 13:10:52