Python:固定等待接收套接字数据的时间

时间:2016-06-06 06:20:40

标签: python sockets

我写了一个udp服务器和客户端。客户端将简单的udp消息发送到服务器,服务器将响应。服务器将随机丢弃一些响应数据包。在我的客户端代码中,我写了以下一行

for i in range(0,10):
  sequence_number = i
  start = time.time()
  clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
  # Receive the client packet along with the address it is coming from
  message, address = clientSocket.recvfrom(1024)
  end = time.time()
  if message != '':
    print message
    rtt = end - start
    print "RTT = " + str(rtt)

如果服务器删除响应,则以下行停留在那里。

message, address = clientSocket.recvfrom(1024)

我在这里尝试了超时方法: Socket recv - limited wait time
但超时将中止整个客户端程序。我只是希望客户端等待5秒钟,然后如果没有收到最后一个响应(由服务器丢弃),则继续发送下一个数据包。 如何在客户端设置等待时间?

2 个答案:

答案 0 :(得分:4)

settimeout()的链接是对的。超时时会引发异常。

  

阻止套接字操作设置超时。 value参数可以是   表示秒的非负浮点数,或无。如果一个   给出非零值,后续套接字操作将引发一个   如果超时期限值已经超过,则超时异常   操作已经完成。如果给出零,则插入套接字   非阻塞模式。如果给出None,则套接字被置于阻塞状态   模式。

您需要将代码放在try块中,以便异常不会中止您的程序。

import socket.timeout as TimeoutException
# set timeout 5 second
clientsocket.settimeout(5)
for i in range(0,10):
  sequence_number = i
  start = time.time()
  clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
  # Receive the client packet along with the address it is coming from
  try:
    message, address = clientSocket.recvfrom(1024)
  except TimeoutException:
    print("Timeout!!! Try again...")
    continue
  end = time.time()
  if message != '':
    print message
    rtt = end - start
    print "RTT = " + str(rtt)

答案 1 :(得分:0)

只需使用此

可读,空,空= select.select(服务器,[],[],10)#等待10秒

 ready_server = readable[0]