Циклический запрос сокета каждые 5 секунд (Python) - PullRequest
0 голосов
/ 30 мая 2011

Как бы я делал каждые 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 секунд с сервера, я сделал некоторое время True loop (lol) и интерфейс программыЯ даже не загрузился, и сервер был залит клиентом.

Я просто хочу, чтобы сервер обновлял клиента каждые 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 ]

2 голосов
/ 30 мая 2011

См. Этот вопрос:

Как сделать так, чтобы tkinter отвечал на события при ожидании данных сокета?

Вы также можете использовать 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 (время, функция) для задержки на определенное количество времени перед повторным вызовом функции.

Наконец, вам действительно нужно поддерживать соединение с сервером, а не каждый раз повторять соединение.

1 голос
/ 30 мая 2011
import time

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

В идеале, после do_stuff up вы должны рассчитать, сколько времени вы спали, а затем скорректировать время сна, чтобы вернуться к синхронизации.

Редактировать: Предполагается, что это все, что вы делаете. В противном случае используйте функции времени, чтобы увидеть, прошло ли это 5 секунд. time.localtime() или что-то в этом роде. Я не помню их имен, но библиотеки Python хорошо документированы.

Редактировать 2: Хотя это может не относиться к tkinter. На самом деле я бы не опубликовал, если бы полный код и tkinter были в исходном сообщении. Извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...