#! /usr/bin/jython
""" Multiple connections with threaded server
Uses locking """
__author__ = "brock"

import socket
import threading

PORT = 40373

def handleclient(clientsock, linecount, linelock):
    """ client handler """
    status = True
    clientin = clientsock.makefile('r')
    clientout = clientsock.makefile('w')
    try:
        data = clientin.readline()
        while data:
            if data[-1:] == '\n':
                data = data[:-1]
            linelock.acquire()
            linecount[0] = linecount[0] + 1
            linelock.release()
            clientout.write('%d: %s' % (linecount[0], data))
            clientout.flush()
            data = clientin.readline()
    except EOFError:
        status = False
    clientin.close()
    clientout.close()
    clientsock.close()
    return status

def main():
    """ main routine """
    linelock = threading.Lock()
    linecount = [0]
    try:
        rendezvous = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ## Do not do the next line....
        rendezvous.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        rendezvous.bind(('', PORT))
        print 'Running on port %d' % (PORT)
        rendezvous.listen(1)
        while 1:
            clientconn, clientaddr = rendezvous.accept()
            print 'Connected to (%s, %s)' % (clientaddr[0], clientaddr[1])
            childthr = threading.Thread(target=handleclient,
                                        args=(clientconn, linecount, linelock))
            childthr.daemon = True
            childthr.start()
    except (EOFError, KeyboardInterrupt):
        pass

if __name__ == "__main__":
    main()
