每5秒循环发送socket请求(Python)

0 投票
2 回答
4710 浏览
提问于 2025-04-16 18:35

我想每隔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秒从服务器接收一次数据,我试过用一个无限循环(哈哈),结果程序界面根本没加载出来,服务器也被客户端搞得忙得不可开交。

我只想让服务器每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()

2 个回答

1
import time

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

理想情况下,在完成 do_stuff 之后,你应该计算一下自己睡了多久,然后根据这个时间调整一下你的睡眠时间,以便重新回到正常的节奏。

补充:这假设你只是在做这个。如果不是的话,可以使用时间函数来查看是否已经过去了5秒。比如 time.localtime() 或其他的。我不记得它们的名字了,但Python的库文档写得很清楚。

补充2:不过这可能不适用于 tkinter。如果原来的信息里包含完整的代码和 tkinter 的内容,我其实就不会发这个了。抱歉!

2

看看这个问题:

如何让tkinter在等待socket数据时响应事件?

你也可以使用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的意思是,当图形界面不再忙的时候,会安排一个函数去调用。你还可以使用.after(time, function)来设置一个特定的时间延迟,然后再调用这个函数。

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

撰写回答