# Matt Anderson 6 May 2002
#  simple server to simulate message passing 
#  illustration of what the multi-tiled display message 
#  passing server looks like
#
## Server side socket check
import sys, time, string
from select import select
from socket import socket, AF_INET, SOCK_STREAM
def now(): return time.ctime(time.time())

myHost = ''
myPort = 10000
numPortSocks = 2

mainsocks, readsocks, writesocks = [], [], []
for i in range(numPortSocks):
  portsock = socket(AF_INET, SOCK_STREAM)
  portsock.bind((myHost, myPort))
  portsock.listen(5)
  mainsocks.append(portsock)
  readsocks.append(portsock)
  myPort = myPort + 1

message = []
pt = []
chk = 0
while 1:
  readables, writeables, exceptions = select(readsocks, writesocks, [])
  for sockobj in readables:
    if sockobj in mainsocks:
      newsock, address = sockobj.accept()
#      print 'Connect:', address, id(newsock)
      readsocks.append(newsock)
    else:
      data = sockobj.recv(1024)
#      print '\tgot', data, 'on', id(sockobj)
      if not data:
        sockobj.close()
        readsocks.remove(sockobj)
#        print pt, 'list test'
#        print len(pt),'length test'
        if ( len(pt) == 48 ): 
          chk=1
#          print len(pt), 'length'
      else:
        pt.append(data)
        sockobj.send('Echo')
  if ( chk == 1 ) : 
# sync and send out data from master process
    for indy in pt:
      result, procID = string.split(indy,'__')
      if ( procID == '0' ):
        message.append(result)

#    print message, 'message'

    time.sleep(0.001)
    serverHost = 'geppetto.ph.utexas.edu'
    serverPort = 20001
    sockobj = socket(AF_INET, SOCK_STREAM)
    sockobj.connect((serverHost, serverPort))

    for line in message:
      sockobj.send(line)
      data = sockobj.recv(1024)
#      print 'Client received:', data
    sockobj.close()

    time.sleep(0.001)
    serverHost = 'geppetto.ph.utexas.edu'
    serverPort = 20002
    sockobj = socket(AF_INET, SOCK_STREAM)
    sockobj.connect((serverHost, serverPort))

    for line in message:
      sockobj.send(line)
      data = sockobj.recv(1024)
#      print 'Client received:', data
    sockobj.close()


# set up for another round of message passing 
    chk = 0
    pt[0:] = []
    message = []
