Package SmootLight :: Package inputs :: Module TCPInput
[hide private]
[frames] | no frames]

Source Code for Module SmootLight.inputs.TCPInput

 1  import util.Strings as Strings 
 2  import pdb 
 3  from operationscore.Input import * 
 4  import socket, json, time 
 5  import logging as main_log 
 6  import string 
 7  from select import select 
 8   
9 -class TCPInput(Input):
10 """TCPInput is a input to receive input on a TCP port. In its current incarnation, it parses 11 json data into python dicts. Warning: contains a bug where init will hang until it receives a 12 connection. Specify: 13 <Port> -- Port number to listen on."""
14 - def inputInit(self):
15 self.HOST = '' # Symbolic name meaning all available interfaces 16 self.PORT = self.argDict['Port'] # Arbitrary non-privileged port 17 self.BUFFER_SIZE = 1024 18 self.IS_RESPONDING = 1 19 20 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 21 self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 22 self.sock.bind((self.HOST, self.PORT)) 23 self.sock.listen(1) 24 25 isreadable=select([self.sock],[],[], 0)[0] 26 self.conn = None 27 if isreadable: 28 (self.conn, self.address) = self.sock.accept()
29
30 - def sensingLoop(self):
31 if self.conn == None: 32 isreadable=select([self.sock],[],[], 0)[0] 33 if isreadable: 34 (self.conn, self.address) = self.sock.accept() 35 else: 36 return 37 38 data = self.conn.recv(self.BUFFER_SIZE) 39 main_log.debug('Incoming data', data) 40 41 if not data or 'end' in data: # data end, close socket 42 main_log.debug('End in data') 43 print 'end of stream' 44 self.IS_RESPONDING = 0 45 self.conn.close() 46 self.sock.close() 47 48 if self.IS_RESPONDING == 1: # if 'responding', respond to the received data 49 try: 50 for datagroup in data.split('\n'): 51 if datagroup != None and datagroup != '': 52 dataDict = json.loads(datagroup) 53 #if dataDict['type'] != 1: 54 #print dataDict 55 self.respond(dataDict) 56 except Exception as exp: 57 print str(exp) 58 else: 59 # if not 'responding', don't respond to data and restart socket 60 # * an incomplete hack for now. will be changed if same-type-multi-Input is implemented. 61 62 self.IS_RESPONDING = 1 63 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 64 self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 65 self.sock.bind((self.HOST, self.PORT)) 66 self.sock.listen(1) 67 (self.conn, self.address) = self.sock.accept()
68