Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:套接字以时间间隔发送数据_Python_Python 2.7_Python Sockets - Fatal编程技术网

Python:套接字以时间间隔发送数据

Python:套接字以时间间隔发送数据,python,python-2.7,python-sockets,Python,Python 2.7,Python Sockets,我开发了一个代码,在这个代码中,我每秒都从串口读取数据。相同的数据我必须发送数据到任何IP和端口,但有一个特定的时间间隔,如10秒,30秒等 所以,如何告诉套接字进入睡眠状态,它不会每秒发送数据 import time time.sleep(x) x:睡眠时间(以秒为单位)您不需要告诉插座进入睡眠状态,插座应该一直在监听。你能做的就是让你的程序每隔一秒钟就这样进入睡眠状态 import time while(true): sock.recv() time.sleep(1) 或者

我开发了一个代码,在这个代码中,我每秒都从串口读取数据。相同的数据我必须发送数据到任何IP和端口,但有一个特定的时间间隔,如10秒,30秒等

所以,如何告诉套接字进入睡眠状态,它不会每秒发送数据

import time   
time.sleep(x)

x:睡眠时间(以秒为单位)

您不需要告诉插座进入睡眠状态,插座应该一直在监听。你能做的就是让你的程序每隔一秒钟就这样进入睡眠状态

import time
while(true):
  sock.recv()
  time.sleep(1)

或者,如果你想更具冒险精神,你可以使用一个epoll循环来检查你的套接字是否收到了任何东西。epoll循环的一个很好的例子在这里,但很可能不是必需的。如果您开始使用socket编程,您可能需要了解一些情况。如果您无法限制socket发送速率,唯一的解决方案是将调用限制在发送套接字上。 首先,您必须在这里做的是将接收到的数据放在一个容器中(看一看),然后,您必须安排发送过程。你可以用一只手来做这个。 它可能看起来像是:

class Exchange(object):
    def __init__(self):
        #create the queue
        #create the sockets

    def receive_every_seconds_method(self):
        # Here we put the received data into the queue
        self.the_queue.put(self.receiving_socket.recv())

    def send_data_later(self):
        while not self.the_queue.empty():
            self.emission_socket.send(self.the_queue.get())
        # reschedule
        self.schedule()

    def schedule(self, timeout=30):
        self.timer = Timer(timeout, self.send_data_later)
        self.timer.start()

    def run(self):
        self.schedule(30)
        while self.continue_the_job: #this is the stop condition
            self.receive_every_seconds_method()
            time.sleep(1)

通过这种方式,您将能够每30秒发送一次数据(如果有数据要发送)

您实际上无法告诉套接字进入睡眠状态,您可以在其中创建一个包含睡眠的循环(time.sleep(..),或者更好的方法是使用一个单独的线程/pthread和一个堆栈,在该堆栈中您每X秒轮询一次数据,然后对其进行操作(发送或做任何你想做的事情),这样你就不会锁定阅读线程。谢谢你分享了一些好东西,但我想在客户端开发一个逻辑,而不是在服务器端。@MeetAdhia epoll循环可以在客户端和服务器端使用。老实说,我想我们需要更多关于你的问题的信息来正确解决它。你只是不断地发送t吗在您接收到相同的信息后,会将其发送到ip和端口吗?它是否需要更改?间隔是否会更改或始终保持不变?是的,我一直在向ip和端口发送数据。我已通过使用多线程找到了解决问题的方法。