【问题标题】:Python Socket Using Select To Check For DataPython Socket 使用 Select 来检查数据
【发布时间】:2015-12-21 14:32:04
【问题描述】:

我在另一篇文章中发现了以下代码,效果很好:

UDP_IP = ''
UDP_PORT = 5008
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', UDP_PORT))
while 1:
  socket_list = [sys.stdin, s]
  # Get the list sockets which are readable
  read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])
  for sock in read_sockets:
   #incoming message from remote server
   if sock == s:
      data = sock.recv(4096)
      if not data :
        print '\nDisconnected from server'
        sys.exit()
      else :
         #print data
         sys.stdout.write(data)

   #user entered a message
   else :
     msg = sys.stdin.readline()
     s.send(msg)

我遇到的问题是 for 循环,因为它只有在收到数据时才会运行。我真的很希望它使用一个while循环并让它偶尔检查是否已收到数据,但我不知道如何做到这一点。

【问题讨论】:

  • 用您的支票替换sys.stdout.write(data)
  • 我总是建议使用异步编程框架来支持低级套接字编程。
  • 我尝试替换 sys.stdout.... 但它没有帮助。它仍然只在我发送数据时运行。知道我做错了什么吗?
  • 感谢华作的帖子-我仍在努力弄清楚如何让您的建议发挥作用。

标签: python sockets select


【解决方案1】:

在 select 语句中使用 timeout 参数。如果没有数据可用(由空列表表示),您可以在 while 循环的主体中执行任何其他需要的处理。

【讨论】:

  • 感谢您的回复。我已经尝试按照您的建议进行操作,但我无法让它循环,因为它一直在等待接收数据。 @sureshvv
  • 它在哪一行等待?你的超时值是多少?您是否正在检查 select 的返回值?看起来你应该调试你的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2016-05-27
  • 2015-06-30
相关资源
最近更新 更多