meta data for this page
  •  

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
courses:ct30a6000:hw_01 [2012/01/22 20:36]
hevi
courses:ct30a6000:hw_01 [2012/01/22 20:39]
hevi
Line 5: Line 5:
 Development to point Development to point
  
-{{:​courses:​ct30a6000:​cspa_01.zip|}}+{{:​courses:​ct30a6000:​class_diagram1.png?200|}}
 Entities Entities
- 
  
 {{:​courses:​ct30a6000:​sequence_diagram1.png}} {{:​courses:​ct30a6000:​sequence_diagram1.png}}
 Communication Communication
  
-{{:​courses:​ct30a6000:​main_server_sm.png?200|}} +{{:​courses:​ct30a6000:​main_server_sm.png|}} 
-main_server ​statemachnine+main_server ​state machine 
 + 
 +**exer_udb_b.main_client** 
 +<​code>​ 
 +import socket 
 +import logging  
 +log = logging.getLogger(__name__) 
 + 
 +echo_host = "​localhost"​ 
 +echo_port_client = 23456 
 +echo_port_server = 23456 + 1 
 + 
 +def run(): 
 +  log.debug("​client running ..") 
 +  s = socket.socket(socket.AF_INET,​socket.SOCK_DGRAM) 
 +  s.bind( (echo_host,​echo_port_client) ) 
 + 
 +  ## send and receive a message  
 +  send_msg = "ECHO MESSAGE"​ 
 +  log.debug("​Sending " + send_msg) 
 +  s.sendto(send_msg,​ (echo_host, echo_port_server) ) 
 +  recv_msg = s.recv(4096) 
 +  log.debug("​Received " + recv_msg)  
 +  s.close() 
 + 
 +if __name__ == '​__main__':​ 
 +  logging.basicConfig(level=logging.DEBUG) 
 +  run()   
 +</​code>​ 
 + 
 +**exer_udb_b.main_server** 
 +<​code>​ 
 +'''​ 
 +Created on 9.1.2012 
 + 
 +@author: hevi 
 + 
 + 
 +concrete message coding (simple), messages 
 + 
 +character base coding as a ascii character set. 
 +message boundaries is based on one UDP message, ie. 
 +application message == UPD message. 
 + 
 +common message: 
 +type as char 
 +sid  as string (except on open_session)  
 +data as string 
 +- fields are separated by space  
 + 
 +open_session 
 +  type: '​o'​ 
 +  data: host and port    
 + 
 +number 
 +  type: '​n'​ 
 +  sid:  string 
 +  data: number 
 + 
 +result 
 +  type: '​r'​ 
 +  sid:  string 
 +  data: number 
 + 
 +close_session 
 +  type: '​c'​ 
 +  sid:  string ​  
 +  data: None 
 + 
 +set_sid 
 +  type: '​s'​ 
 +  sid: string 
 + 
 + 
 +'''​ 
 + 
 +import socket 
 +import logging  
 +log = logging.getLogger(__name__) 
 + 
 +echo_host = "​localhost"​ 
 +echo_port_client = 23456 
 +echo_port_server = 23456 + 1 
 + 
 +class Session(object):​ 
 +  def __init__(self,​host,​port,​sid):​ 
 +    self.client_host = host 
 +    self.client_port = port 
 +    self.sid = sid 
 + 
 +  def open_session(self):​ 
 +    msg = "s " + str(self.sid) 
 +    sock.sendto(msg,​ (self.client_host,​ self.client_port) ) 
 +   
 +  def number(self,​n):​ 
 +    pass 
 +   
 +  def close_session(self):​ 
 +    pass 
 + 
 +sessions = list() 
 +sid_counter = 1 
 +sock = None 
 + 
 +# echo service 
 +def run(): 
 +  log.debug("​server running ..") 
 +  sock = socket.socket(socket.AF_INET,​socket.SOCK_DGRAM) 
 +  sock.bind( (echo_host,​echo_port_server) ) 
 +  # loop 
 +  while True: 
 +    msg, sender = sock.recvfrom(4096)  
 +    log.debug("​msg " + msg + " ip " + sender[0] + " port " + str(sender[1])) 
 +    #​s.sendto(msg,​ (sender[0], echo_port_client) ) 
 +    ## decoding 
 +    parts = msg.split() 
 +    type = parts[0] 
 +    if type == '​o':​ 
 +      client_host = parts[1] 
 +      client_port = int(parts[2]) 
 +      sid = sid_counter 
 +      sid_counter += 1 
 +      session = Session(client_host,​client_port,​sid) 
 +      sessions.append(session) 
 +      session.open_session() 
 +    elif type == '​n':​ 
 +      sid = parts[1] 
 +      ## lookup 
 +      session = None 
 +      for s in sessions: 
 +        if s.sid == sid: 
 +          session = s 
 +      if session == None: 
 +        log.error("​unknonw sid " + sid) 
 +        continue 
 +      ## 
 +      number = int(parts[2]) 
 +      session.number(number) ​      
 +    elif type == '​r':​ 
 +      pass 
 +    elif type == '​c':​ 
 +      sid = parts[1] 
 +      ## lookup 
 +      session = None 
 +      for s in sessions: 
 +        if s.sid == sid: 
 +          session = s 
 +      if session == None: 
 +        log.error("​unknonw sid " + sid) 
 +        continue 
 +      ## 
 +      session.close_session() 
 +      sessions.remove(session) 
 +    else: 
 +      log.error("​unknown type " + type)     
 +  sock.close() 
 +   
 + 
 +if __name__ == '​__main__':​ 
 +  logging.basicConfig(level=logging.DEBUG) 
 +  run()
  
 +</​code>​