I’ve been trying really hard to get my mind around networking, having not been able to sit down and apply it to my Panda project, I decided I would just post my sample classes, maybe some insight can be given into how to apply it, or fix it.
This is the Client code:
import socket
import sys
import threading
class UDPClient(threading.Thread):
_server = None
_msgs = []
def __init__(self, host='localhost',port=9999,size=1024):
self.host = host
self.port = port
self.size = size
self.is_running = threading.Event()
threading.Thread.__init__(self)
def start_server(self):
try:
self._server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self._server.connect((self.host,self.port))
self._server.setblocking(False)
except socket.error, (value,message):
if self._server:
self._server.close()
print "Could not connect socket: " + message
sys.exit(1)
def run(self):
if not self._server:
self.start_server()
while not self.is_running.isSet():
#Do stuff
self.poll_server()
if len(self._msgs) > 0:
self.send_msg()
def poll_server(self):
try:
data = self._server.recv(self.size)
self.process_data(data)
except socket.error:
pass
def process_data(self, data):
print data
def send_msg(self):
for i in range(len(self._msgs)):
msg = self._msgs.pop(i)
self._server.send(msg)
def add_message(self, data):
self._msgs.append(data)
def shutdown(self):
self.is_running.set()
self.join()
self._server.close()
if __name__ == "__main__":
c = UDPClient()
c.start()
print 'Started thread'
going = True
while going:
line = raw_input()
if line.startswith('quit'):
going = False
else:
c.add_message(line)
c.shutdown()
And the Server:
Note, I might have gone a little overboard with handling bad clients feel free to ignore it
import socket
import sys
import threading
class UDPClient(threading.Thread):
_server = None
_msgs = []
def __init__(self, host='localhost',port=9999,size=1024):
self.host = host
self.port = port
self.size = size
self.is_running = threading.Event()
threading.Thread.__init__(self)
def start_server(self):
try:
self._server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self._server.connect((self.host,self.port))
self._server.setblocking(False)
except socket.error, (value,message):
if self._server:
self._server.close()
print "Could not connect socket: " + message
sys.exit(1)
def run(self):
if not self._server:
self.start_server()
while not self.is_running.isSet():
#Do stuff
self.poll_server()
if len(self._msgs) > 0:
self.send_msg()
def poll_server(self):
try:
data = self._server.recv(self.size)
self.process_data(data)
except socket.error:
pass
def process_data(self, data):
print data
def send_msg(self):
for i in range(len(self._msgs)):
msg = self._msgs.pop(i)
self._server.send(msg)
def add_message(self, data):
self._msgs.append(data)
def shutdown(self):
self.is_running.set()
self.join()
self._server.close()
if __name__ == "__main__":
c = UDPClient()
c.start()
print 'Started thread'
going = True
while going:
line = raw_input()
if line.startswith('quit'):
going = False
else:
c.add_message(line)
c.shutdown()
Comments and suggestions appreciated