meta data for this page
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
courses:ct30a6000:hw_01 [2012/01/22 20:37] hevi |
courses:ct30a6000:hw_01 [2012/01/22 20:39] (current) hevi |
||
---|---|---|---|
Line 12: | Line 12: | ||
{{:courses:ct30a6000:main_server_sm.png|}} | {{: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> | ||