# Server program
# UDP VERSION


import socket

class Server:
    
    # Set the socket parameters
    #host = "localhost"
    host = '192.168.1.255'
    port = 5500
    buf = 1024
    addr = (host,port)
    
    def __init__(self):
        
        self.createObjects()
        
    def createObjects(self):
        
        # Create socket and bind to address
        self.sock_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock_s.bind(self.addr)

    def listen(self):
        
        # Receive messages
        print "Server initialized ..."
        print
        while 1:
            data_rx, addr_rx = self.sock_s.recvfrom(self.buf)
            if not data_rx:
                print "Client has exited!"
                break
            
            print "\nSERVER:"
            print "Received message '", data_rx,"'"
            print "Sendinf ack ..."
            self.sock_s.sendto('ack', addr_rx)

        # Close socket
        self.sock_s.close()
    
    def start(self):
        
        self.listen()
        
class Client:
    

    # Set the socket parameters
    #host = '0.0.0.0'
    host = '192.168.1.255'
    #port = 5140
    port = 5500
    #port = 7000
    buf = 1024
    multicast_addr = (host,port)

    def __init__(self):
        
        self.createObjects()
    
    def createObjects(self):
        
        # Create socket
        #self.socket_c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket_c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,0)
        self.socket_c.settimeout(0.2)
        
#        self.socket_c.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20)
        self.socket_c.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

        
    def sendData(self):
        
        def_msg = "===Enter message to send to server===";
        print "\n", def_msg
        print

        # Send messages
        while (1):
            print "\nCLIENT"
            data = raw_input('>> ')
            if not data or data == 'q':
                break
            
            if(self.socket_c.sendto(data, self.multicast_addr)):
                
                print "Sending message '",data,"'....."
                
                data_rx, server_rx = self.socket_c.recvfrom(16)
                
                print "Data received ", data_rx, server_rx 
        
        # Close socket
        self.socket_c.close()
        
    def start(self):
        
        self.sendData()
        
import threading  

class MiThread(threading.Thread):
    def __init__(self, obj):
        
        threading.Thread.__init__(self)
        self.obj = obj
        
    def run(self): 
        
        self.obj.start()
        
        
if __name__ == '__main__': 
    
    serverObj = Server()
    clientObj = Client()
    
    ts = MiThread(serverObj)
    tc = MiThread(clientObj)
    
    ts.start()
    tc.start()
    
    tc.join()
    ts.join(60)

          
    