5
from warnings import filterwarnings
6
from twisted.internet import reactor
7
from twisted.internet.protocol import DatagramProtocol
8
from socket import inet_aton
9
from datetime import datetime
10
from traceback import print_exc
11
from sys import stdout
13
class Udp_server(DatagramProtocol):
16
def __init__(self, address = None, data_callback = None):
17
self.data_callback = data_callback
19
reactor.listenUDP(0, self)
21
reactor.listenUDP(address[1], self, address[0])
22
filterwarnings('ignore', '^Please only pass')
24
def send_to(self, data, address):
28
reactor.callInThread(self.transport.write, data, address)
30
#self.transport.write(data, address)
31
reactor.callInThread(self.transport.write, data, address)
33
def datagramReceived(self, data, address):
34
if self.data_callback != None:
36
self.data_callback(data, address, self)
37
#reactor.callInThread(self.data_callback, data, address, self)
39
print datetime.now(), '** Udp_server: unhandled exception in incoming data callback'
41
print_exc(file = stdout)
59
def ping_received(self, data, address, udp_server):
60
if not (data == 'ping!' and address == ('127.0.0.1', 54321)):
63
#reactor.callInThread(aSillyBlockingMethod, "2 seconds have passed")
64
udp_server.send_to('pong!', address)
66
def pong_received(self, data, address, udp_server):
68
if not (data == 'pong!' and address == ('127.0.0.1', 12345)):
70
reactor.callFromThread(reactor.stop)
73
def aSillyBlockingMethod(x):
78
if __name__ == '__main__':
81
udp_server_ping = Udp_server(('127.0.0.1', 12345), c.ping_received)
82
udp_server_pong = Udp_server(('127.0.0.1', 54321), c.pong_received)
83
udp_server_pong.send_to('ping!', ('127.0.0.1', 12345))
85
# Thread(name='Reactor Thread', target=self._run_reactor).start()
87
# run method in thread
88
#reactor.callInThread(aSillyBlockingMethod, "2 seconds have passed")