JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Marcin Lewandowski [ mlew@ippt.gov.pl ]
PROGRAMOWANIE SIECIOWE 2
TCP/IP = UDP + TCP TCP/IP składa się z dwóch podstawowych protokołów: TCP i UDP. TCP jest protokołem połączeniowym z zapewnieniem poprawności przesyłanych danych UDP jest protokołem niższego poziomu bezpołączeniowym, który nie gwarantuje dotarcia danych do adresata Większość protokołów wyższego poziomu opiera się na TCP Oba protokoły są obsługiwane za pomocą interfejsu programistycznego zwanego socket. Socket to logiczny obiekt plikowy, który zapewnia komunikację (pozwala na przyjmowanie połączeń przychodzących, nawiązywanie połączeń wychodzących, i przekazywanie danych). Komputer przyjmujący połączenie przez socket (tzw. serwer) musi związać socket do określonego portu. Port jest 16-bit numerem (0 65535), który jest używany przez system operacyjny do zarządzania połączeniami klient-serwer. Porty 0 1023 są zarezerwowane do obsługi znanych protokołów sieciowych (np. 80-HTTP, 23-Telnet) pełna lista: http://www.iana.org/assignments/port-numbers 3
TCI i UDP przez socket TCP UCP Na podstawie: David M. Beazley, Python Essential Reference, Pearson Education, 2009 4
Literatura uzupełniającą W. Richard Stevens: Unix Network Programming, Volume 1: The Sockets Networking API, Prentice Hall, 2003. UNIX Network Programming, Volume 2: Interprocess Communications, Prentice Hall, 1998. TCP/IP Illustrated, Vol. 1: The Protocols, Addison- Wesley, 1994 TCP/IP Illustrated, Vol. 2: The Implementation, Addison-Wesley, 1995 TCP/IP Illustrated, Vol. 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols, Addison- Wesley, 1996 5
Python moduły sieciowe Nazwa modułu socket, ssl socketserver http.server Email urllib.request, urllib.parse, urllib.error ftplib, poplib, imaplib, nntplib, smtplib, telnetlib xmlrpc.client, xmlrpc.server cgi, cgitb asyncore, asynchat Opis Niskopoziomowa obsługa komunikacji TCP/IP socket i SSL dla socket Framework dla budowy usług serwerów Serwer HTTP Obsługa Email i MIME Klient WWW Moduły klientów dla różnych protokołów XML-RPC klient i serwer Common Gateway Interface interfejs do wywoływania skryptów przez serwer HTTP Asynchroniczna obsługa komunikacji sieciowej 6
TCP serwer czasu from socket import * import time s = socket(af_inet, SOCK_STREAM) # Create a TCP socket s.bind(('',8888)) # Bind to port 8888 s.listen(5) # Listen, upto than 5 pending connections while True: client,addr = s.accept() # Get a connection print("got a connection from %s" % str(addr)) timestr = time.ctime(time.time()) + "\r\n" client.send(timestr.encode('ascii')) client.close() 7
TCP client do serwera czasu # Time client program from socket import * s = socket(af_inet,sock_stream) # Create a TCP socket s.connect(('localhost', 8888)) # Connect to the server tm = s.recv(1024) # Receive upto 1024 bytes s.close() print("the time is %s" % tm.decode('ascii')) 8
Moduł ftplib >>> from ftplib import FTP >>> ftp = FTP('ftp.cwi.nl') # connect to host, default port >>> ftp.login() # user anonymous, passwd anonymous@ >>> ftp.retrlines('list') # list directory contents total 24418 drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48. dr-xr-srwt 105 ftp-usr pdmaint 1536 Mar 21 14:32.. -rw-r--r-- 1 ftp-usr pdmaint 5305 Mar 20 09:48 INDEX... >>> ftp.retrbinary('retr README', open('readme', 'wb').write) '226 Transfer complete.' >>> ftp.quit() 9
Moduł ftplib FTP.set_debuglevel(level) ustawia poziom debuggowania () dla danej instancji. 0 (domyślnie) nie produkuje żadnej informacji debuggowej 1 produkuje podstawową informację o połączeniu (~jedną linię dla każdego żądania) 2 i więcej produkuje duużo informacji 10
Moduły http Moduł http zapewnia obsługę protokołu HTTP (dla klientów i serwerów), w tym zarządzanie stanem (cookies) Podstawowe metody HTTP: GET pobierz dokument POST prześlij dane z formularza HEAD pobierz nagłówek PUT załaduj dane na serwer Uwaga na zmiany: Python 2: httplib -> Python 3: http.client Python 2: BaseHTTPServer -> Python 3: http.server 11
Moduł urllib Wysokopoziomowy moduł do realizacji interakcji z serwerami HTTP, FTP, plikami lokalnymi Typowe zastosowania: scraping automatyzacja pobierania danych z sieci Web crawlers przeszukiwacze sieci Proxies 12
urllib import urllib URL = 'http://www.ippt.gov.pl/index.htm' fhand = urllib.urlopen(url) for line in fhand: print line.strip() 13
Yahoo! Weather RSS Feed Dane o prognozie pogody dla Warszawy z: Yahoo! Weather RSS Feed Dane na stronie: http://weather.yahoo.com/poland/masovian/ warsaw-523920 Dokumentacja RSSa: http://developer.yahoo.com/weather 14