#! /usr/bin/env python
# -*- coding: Utf-8 -*-

# Egyszerűsített CHAT rendszert kezelő hálózati server definíciója 
# Thread-eket használ a párhuzamos klienskapcsolatok kezelésére.

HOST = '127.0.0.1'
PORT = 40000

import socket, sys, threading

class ThreadClient(threading.Thread):
    '''a klienskapcsolatok kezelésére szolgáló thread-objektum leszármaztatása'''
    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connection = conn
        
    def run(self):
        # Párbeszéd a klienssel :
        name = self.getName()            # Minden thread-nek neve van
        while 1:
            msgClient = self.connection.recv(1024)
            if msgClient.upper() == "FIN" or msgClient =="":
                break
            message = "%s> %s" % (name, msgClient)
            print message
            # Az összes többi klienssel nyomonkövettetjük az üzenetet :
            for cle in conn_client:
                if cle != name:          # nem küldjük vissza a kibocsátónak
                    conn_client[cle].send(message)
                    
        # Kapcsolat zárása :
        self.connection.close()      # serveroldalon megszakítjuk a kapcsolatot
        del conn_client[name]        # töröljük a bejegyzését a szótárból
        print "Kliens %s lekapcsolódott." % name
        # A thread itt ér véget   

# Server inicializálása -Socket létrehozása :
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    mySocket.bind((HOST, PORT))
except socket.error:
    print "A socket kapcsolódása a választott címhez meghiúsult."
    sys.exit()
print "Server kész, várja a kéréseket ..."
mySocket.listen(5)

# A kliens által kért kapcsolatok várása és kezelése :
conn_client = {}                # klienskapcsolatok szótára
while 1:    
    connection, adresse = mySocket.accept()
    # Új thread-objektum létrehozása a kapcsolat kezelésére :
    th = ThreadClient(connection)
    th.start()
    # A kapcsolat tárolása a szótárba  : 
    it = th.getName()        # thread-azonosító
    conn_client[it] = connection
    print "Kliens %s felkapcsolódott, IP-cím %s, port %s." %\
           (it, adresse[0], adresse[1])
    # Párbeszéd a klienssel :
    connection.send("Ön felkapcsolódott. Küldjön üzeneteket !")
