Network 24th April, 2013
1 Transport layer 2 3 4
Network layers HTTP, POP3, SMTP, FTP Transport layer TCP, UDP Internet
User Datagram Protocol (UDP) Features of UDP Very easy Unreliable: no acknowledgment, retransmission or timeout. Used generally in local (reliable) networks Communication based on sockets
Example Transport layer Task Send from client s host to server a message "Hello ".
Client Transport layer Implementation import socket port = 8081 host = localhost s = socket.socket(socket.af_inet, socket.sock_dgram) s.sendto( Hello,!!!, (host, port))
Receiver Transport layer Implementation import socket port = 8081 s = socket.socket(socket.af_inet, socket.sock_dgram) s.bind((, port)) print Listening port, port while True: data, addr = s.recvfrom(1024) print Sender, addr, data, data
Sockets Transport layer Other functions provided by socket: gethostname() host name gethostbyname(hostname) IP of host gethostbyaddr(ip_address) SSL
Advanced task How to monitor remote computers by a web browser Each computer runs a special http server; each request triggers an action, e.g.: http://host/uptime runs a command uptime and sends a result to web browser; default action: a list of available functions.
Some details of http protocol: request Client GET / HTTP/1.1 Host: www.ii.uni.wroc.pl User-Agent: Mozilla/5.0
Some details of http protocol, response Server HTTP/1.1 200 OK Date: Mon, 21 Dec 2009 09:14:01 GMT Server: Apache/2.0.54 (Debian GNU/Linux) Content-Length: 37402 <data>
HTTP request processing Web server: an object of the class BaseHTTPServer.HTTPServer supports http needs an object which now how to deal with different types of requests
HTTP request processing Web server: an object of the class BaseHTTPServer.HTTPServer supports http needs an object which now how to deal with different types of requests Request processing: a class BaseHTTPRequestHandler abstract class methods processing requests like GET, POST, HEADER,... helpers to create responses
Server Transport layer Implementation from BaseHTTPServer import * import os class MyHttpHandler(BaseHTTPRequestHandler):
MyHttpHandler implementation Processing GET request def do_get(self): self.send_response(200) self.send_header( Content-type, text/html ) self.end_headers() self.wfile.write( <html><head></head> ) self.wfile.write( <body> ) if self.path == /uptime : self.uptime() else : self.menu() self.wfile.write( </body></html> ) self.wfile.close()
Server implementation uptime implementation def uptime(self): res = os.popen( uptime ).read() self.wfile.write( <h1>result of uptime</h1> ) self.wfile.write( <tt> + res + </tt> )
Server implementation Menu def menu(self): self.wfile.write( <h1>server</h1> ) self.wfile.write( <ul> ) self.wfile.write( <li><a href="uptime">uptime</a></li> ) self.wfile.write( </ul> )
Http server Start the server address = (, 8000) httpd = BaseHTTPServer.HTTPServer(address, MyHttpHandler) httpd.serve_forever()
Client HTTP import httplib class browser: def init (self): h = self.request( computer12, GET, /uptime/ ) resp = h.getresponse() print Kod, resp.status print resp.read()
Client HTTP import httplib class browser: def init (self): h = self.request( computer12, GET, /uptime/ ) resp = h.getresponse() print Kod, resp.status print resp.read() Preparing request def request(self, host, method, page): headers = { Host : host, Accept : text/html } h = httplib.httpconnection(host) h.request(method, page,, headers) return h
http client Transport layer Run client browser()
Batteries Included Standard libraries ftplib, poplib, mmtplib, nntplib, email, mimetools, mimetypes, base64
Batteries Included Standard libraries ftplib, poplib, mmtplib, nntplib, email, mimetools, mimetypes, base64 For pirates TinyP2P
Transport layer foo(args) wynik
Used protocols General InterORB Protocol Remote Java Invocation RPC.NET Remoting XML RPC...
Task Transport layer A server computing nth Fibonacci number
Server Transport layer Implementation def fib(n): if n < 2: return 1 return fib(n - 1) + fib(n - 2)
Server Transport layer Implementation def fib(n): if n < 2: return 1 return fib(n - 1) + fib(n - 2) Server implementation from SimpleXMLRPCServer import * server = SimpleXMLRPCServer(( localhost, 8002)) server.register_function(fib) server.register_function(lambda x, y: x + y, add ) server.serve_forever()
Client Transport layer Implementation import xmlrpclib server = xmlrpclib.server( http://localhost:8002 ) print server.fib(10) print server.add(2,3)
SOAP Transport layer Simple Object Access Protocol Extension of XML-RPC W3C standard No library in standard distribution of Independent distribution SOAP, eg. SOAPPy
SOAP services Public services in SOAP Google Amazon Allegro
Multithreading server How to do that?
Solution Transport layer Mix-in classes SocketServer.ThreadingMixIn SocketServer.ForkingMixIn
import SocketServer from SimpleXMLRPCServe import SimpleXMLRPCServer
import SocketServer from SimpleXMLRPCServe import SimpleXMLRPCServer class AsyncServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): pass server = AsyncServer((, 8002))
import SocketServer from SimpleXMLRPCServe import SimpleXMLRPCServer class AsyncServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): pass server = AsyncServer((, 8002)) server.register_function(foo) server.serve_forever()