Форум сайта python.su
Здравствуйте.Есть программа, которая по udp принимает данные, которые посылаются постоянно. В этой программе надо после каждого прочтения обнулять буффер, чтобы читались актуальные данные и буфер не забивался старыми данными. Как это реализовать?
Офлайн
sonchess2000А как ты понял, что буфер не обнуляется?
В этой программе надо после каждого прочтения обнулять буффер
Офлайн
А как ты понял, что буфер не обнуляется?Когда я перестаю передавать данные по udp, то в приеме идут старые данные, скопившиеся там некоторое время.
Отредактировано sonchess2000 (Янв. 11, 2015 13:49:35)
Офлайн
sonchess2000
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.
Офлайн
JOHN_16
Не ясно что из себя представляет собой этот буфер - нужно посмотреть на рабочий код.
#!/usr/bin/env python3 import socket HOST = '' PORT = 12345 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((HOST, PORT)) while True: input() data = s.recv(1024) print(data)
[guest@localhost py]$ for i in `seq 5`; do echo x$i | nc -u localhost 12345; done [guest@localhost py]$
[guest@localhost py]$ ./udpserv.py
b'x1\n'
b'x2\n'
b'x3\n'
b'x4\n'
b'x5\n'
^CTraceback (most recent call last):
File "./udpserv.py", line 13, in <module>
data = s.recv(1024)
KeyboardInterrupt
[guest@localhost py]$
Отредактировано py.user.next (Янв. 12, 2015 01:44:08)
Офлайн
py.user.nextЧто можно придумать?
Накапливаются сообщения, хоть блокирующий он, хоть не блокирующий.Ему нужно начальные сообщения отбросить, а последнее оставить.
import SocketServer import httplib import time import socket def clearBuffer(sock): for i in xrange(0,5): sock.recv(50) class MyUDPHandler(SocketServer.BaseRequestHandler): def handle(self): data = self.request[0].strip() sock= self.request[1] print "{} wrote:".format(self.client_address[0]) print data socket.sendto(data.upper(), self.client_address) dat = data.split(" ") .... .... #Вот здесь дальше идет отправка команды в виде строки по http на камеру if(len(cmd)): tCmdStart = time.clock() try: t1 = time.clock() conn.request("GET", cmd);conn.close() t2 = time.clock() except: conn.close() pause(tPause) #пауза рассчитывается в зависимости от переданной команды if((t2-t1)>1): raise() clearBuffer(sock) if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler) server.serve_forever()
Отредактировано sonchess2000 (Янв. 13, 2015 07:30:25)
Офлайн
sonchess2000Можно сделать класс, который будет постоянно читать и сохранять только последнее сообщение, и общаться с сетью через него. Для начала можно попробовать без многопоточности. Если же может быть много сообщений, то могут быть задержки, поэтому надо делать приём в параллельном потоке.
Что можно придумать?
sonchess2000Ну, пока там что-то отправляется, приходят новые сообщения и встают в очередь.
когда я комментирую эту часть программы, то recv() работает так, как мне надо
Отредактировано py.user.next (Янв. 13, 2015 09:58:38)
Офлайн
py.user.next
Спасибо, но как это примерно выглядеть будет, многопоточность бы не хотелось использовать. Сейчас одна часть программы серверная шлет по udp данные, другая часть ( то,что выше ) принимает их и происходит это в двух разных потоках
Отредактировано sonchess2000 (Янв. 13, 2015 10:47:25)
Офлайн
sonchess2000
как это примерно выглядеть будет
#!/usr/bin/env python3 import socket class P: def __init__(self, sockd): self.sockd = sockd self.sockd.setblocking(False) def __del__(self): self.sockd.setblocking(True) def recv(self, size=1024): msgs = [] while True: try: msgs.append(self.sockd.recv(size)) except BlockingIOError: break return msgs and msgs[-1] HOST = '' PORT = 12345 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((HOST, PORT)) proxy = P(s) while True: input() data = proxy.recv() print(data)
[guest@localhost udpserv]$ for i in `seq 1 5`; do echo x$i | nc -u localhost 12345; done [guest@localhost udpserv]$ for i in `seq 6 10`; do echo x$i | nc -u localhost 12345; done [guest@localhost udpserv]$ for i in `seq 11 15`; do echo x$i | nc -u localhost 12345; done [guest@localhost udpserv]$
[guest@localhost udpserv]$ ./udpserv_tm.py
b'x5\n'
b'x10\n'
b'x15\n'
^CTraceback (most recent call last):
File "./udpserv_tm.py", line 31, in <module>
input()
KeyboardInterrupt
[guest@localhost udpserv]$
Отредактировано py.user.next (Янв. 13, 2015 20:18:55)
Офлайн
py.user.next
Спасибо вам большое, так работает, как надо и ошибок не выдает. Получается, что все сообщения, которые не успевают читаться заносятся в список и потом сбрасываются после команды recv()?
Отредактировано sonchess2000 (Янв. 14, 2015 10:33:19)
Офлайн