【问题标题】:Loop socket request every 5 seconds (Python)每 5 秒循环一次套接字请求(Python)
【发布时间】:2011-05-30 01:36:55
【问题描述】:

我将如何每 5 秒循环一次以下代码:

sendSocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sendSocket.connect ( ( 'CENSORED', 1234 ) )
sendSocket.send ( 'request posit' )
data = sendSocket.recv( 100 )
chatLog.insert(END, data)

我希望客户端每 5 秒从服务器接收一次数据,我做了一个 while True 循环(大声笑),程序界面甚至没有加载,服务器被客户端淹没了。

我只希望服务器每 5 秒使用存储在服务器上的变量更新客户端,而无需用户手动按下按钮。

import socket, time
from Tkinter import *

## Main Window
gui = Tk()
gui.geometry('450x350-5+40')
gui.minsize(450,350)
gui.maxsize(450,350)
userInput = StringVar()

## Main window that displays user and server input.
chatLog = Text(gui, width=60, height=15)
chatLog.pack()

## Send Packet function, main part of the script. Sends whatever the user puts in.
def sendChat():
    sendSocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    sendSocket.connect ( ( 'nope.com', 1234 ) )
    sendSocket.send ( e.get() )
    data = sendSocket.recv( 100 )
    chatLog.insert(END, data)
    sendSocket.close()

while True:
    sendSocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    sendSocket.connect ( ( 'nope.com', 1234 ) )
    sendSocket.send ( 'request posit' )
    data = sendSocket.recv( 100 )
    chatLog.insert(END, data)
    sendSocket.close()
    time.sleep (5.0)

## Submit text button
b = Button(gui, text="Send", command=sendChat )
b.pack()

## Text entry box
e = Entry(gui, textvariable=userInput)
e.pack()

gui.mainloop()

【问题讨论】:

  • 你为什么觉得有必要在中间随机插入(lol)?
  • 这个问题的答案取决于您如何创建程序界面。你用什么 wxPython、PyQt、PySide、curses、Gtk?
  • 因为我知道 True 绝对不是正确做某事的正确方法。我还使用 tkinter 制作了 GUI。
  • (lol) 在我看来让你看起来很傻。如果你不这样做,我至少会更认真地对待问题。

标签: python sockets loops


【解决方案1】:

看到这个问题:

How to make tkinter repond events while waiting socket data?

你也可以使用 after_idle

def read_the_socket():
    sendSocket.send ( 'request posit' )
    data = sendSocket.recv( 100 )
    gui.after(5000, read_the_socket)


gui.after_idle(read_the_socket)

after_idle 安排一个函数,一旦 GUI 不再忙,就会调用该函数。您还可以使用 .after(time, function) 在再次调用该函数之前延迟特定的时间。

最后,您应该真正保持与服务器的连接,而不是每次都重新连接。

【讨论】:

  • after(delay_ms, callback, args...) 在这里可能更好,因为after_idle 会被调用很多次。
  • 这很好,很有效,但 1 次后我得到 [Errno 10054] 现有连接被远程主机强行关闭
  • @Brandon,服务器是你的吗?必须对服务器进行编程以允许单个连接的多个请求。否则,您需要在函数中包含整个 connect/send/recv/close。
【解决方案2】:
import time

while True:
    do_stuff ()
    time.sleep (5.0)

理想情况下,在 do_stuff up 之后,您将计算您已经睡了多长时间,然后适当调整您的睡眠时间以恢复同步。

编辑:这假设这就是你所做的一切。否则使用时间函数来查看是否已经 5 秒。 time.localtime() 什么的。我不记得他们的名字了,但是 python 的库是有据可查的。

编辑 2:虽然这可能不适用于 tkinter。如果完整的代码和 tkinter 已经在原始消息中,我真的不会发布。对不起!

【讨论】:

  • 我已经这样做了,服务器现在没有被淹没,但 GUI 仍然没有加载。它是在 tkinter 中制作的。我已经编辑了主要帖子以显示整个代码。
  • 我不知道 tkinter,抱歉,无法帮助您。我根本看不出while True 有问题。
  • 编辑:虽然这可能不适用于 tkinter。如果完整的代码和 tkinter 已经在原始消息中,我真的不会发布。对不起!
  • 啊,那是我的错,对不起。我只是假设我所做的并不重要,并且会有一个简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多