klijent-server tehnologije · adresu uspostavljamo tcp/ip vezu upit dns-u koji nam prevodi dani...
TRANSCRIPT
-
KLIJENT-SERVER
TEHNOLOGIJE
Odjel za matematiku 1
Mrežne tehnologije i Python
Predavanje 02
-
Python programski jezik
Odjel za matematiku 2
Ponovimo …
• Python je interpreterski programski jezik kojeg je stvorio Guido van Rossum
1990.
• (I da, dobio je ime po seriji Leteći cirkus Monty Pythona)
• Predpostavlja se osnovno predznanje programiranja u Python jeziku!
Ukoliko vam nije bilo dovoljno ono što ste naučili o Pythonu na vježbama,
pogledajte http://www.mathos.hr/racnet/program.html (Literatura koja se
preporučuje).
Predavanje 02
http://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.htmlhttp://www.mathos.hr/racnet/program.html
-
Naš prvi zadatak
Odjel za matematiku 3
Saznajte zemljopisnu širinu i dužinu dane adrese
Latitude + Longitude
Adresa = ‘Kardinala Alojzija Stepinca, Osijek,
Croatia’
Primjer
Predavanje 02
• Google Maps API
• Python Standard Library documentation
http://docs.python.org/library/
• Python Package Indeks
http://pypi.python.org/
• Rezultat: googlemaps paket
http://pypi.python.org/pypi/googlemaps/
http://docs.python.org/library/http://docs.python.org/library/http://docs.python.org/library/http://pypi.python.org/http://pypi.python.org/http://pypi.python.org/pypi/googlemaps/http://pypi.python.org/pypi/googlemaps/http://pypi.python.org/pypi/googlemaps/http://pypi.python.org/pypi/googlemaps/http://pypi.python.org/pypi/googlemaps/
-
Odjel za matematiku 4
Python kod koristeći googlemaps gotovo rješenje:
#!/usr/bin/env python
from googlemaps import GoogleMaps
address = '207 N. Defiance St, Archbold, OH'
print GoogleMaps().address_to_latlng(address)
Predavanje 02
Naš prvi zadatak
Saznajte zemljopisnu širinu i dužinu dane adrese
Latitude + Longitude
-
Odjel za matematiku 5Predavanje 02
Naš prvi zadatak
Longitude + Latitude – ispod haube
• Pokušajmo riješiti isti problem, ali bez pomoći rješenja s strane
Promotrite sljedeće rješenje u Python-u:
#!/usr/bin/env python
import urllib, urllib2
try:
import json
except ImportError: # for Python 2.5
import simplejson as json
params = {'q':'Alojzija Stepinca, Osijek, Croatia', 'output': 'json', 'oe': 'utf8'}
url = 'http://maps.google.com/maps/geo?' + urllib.urlencode(params)
rawreply = urllib2.urlopen(url).read()
reply = json.loads(rawreply)
print reply['Placemark'][0]['Point']['coordinates'][:-1]
-
Odjel za matematiku 6
Primjetite da u implementaciji bez korištenja gotovih rješenja bolje
razumijemo što se u kodu dešava
uspostavljamo putanju k nekoj web adresuhttp://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/
s te web adrese (očigledno koristeći HTTP protokol) skidamo
neke podatke strukturirane u java script object object notation formi
učitavamo podatke u json objekt
moramo li nužno razumjeti json objekt?
Predavanje 02
Naš prvi zadatak
Longitude + Latitude – ispod haube
print reply
{u'Status': {u'code': 200, u'request': u'geocode'}, u'Placemark': [{u'Point': {u'coordinates': [18.6860492, 45.5571403, 0]},
u'ExtendedData': {u'LatLonBox': {u'west': 18.6829114, u'east': 18.6892067, u'north': 45.5618861, u'south': 45.553646}},
u'AddressDetails': {u'Country': {u'CountryName': u'Republika Hrvatska', u'AdministrativeArea': {u'AdministrativeAreaName':
u'Osje\u010dko-baranjska', u'Locality': {u'Thoroughfare': {u'ThoroughfareName': u'Kardinala Alojzija Stepinca'},
u'LocalityName': u'Osijek'}}, u'CountryNameCode': u'HR'}, u'Accuracy': 6}, u'id': u'p1', u'address': u'Kardinala Alojzija
Stepinca, Osijek, Croatia'}], u'name': u'Alojzija Stepinca, Osijek, Croatia'}
http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/http://code.google.com/intl/hr-HR/apis/maps/documentation/geocoding/
-
Odjel za matematiku 7Predavanje 02
Naš prvi zadatak
Longitude + Latitude – još dublje ispod haube
urllib2.urlopen(url).read()
Prisjetite se kako za dani URL (Uniform Resource Locator) tj. web
adresu uspostavljamo TCP/IP vezu
Upit DNS-u koji nam prevodi dani string u 32-bitnu IP adresu:
Npr. 193.168.69.3 (pitagora)
Uspostavljamo TCP/IP vezu s serverom zadane IP adrese na
portu 80
Saljemo serveru i primamo od servera IP pakete
Dobra stvar: sav posao je odradila urllib klasa predefinirana u
standardnoj pythonovoj biblioteci.
-
Odjel za matematiku 8Predavanje 02
Naš prvi zadatak
Longitude + Latitude – još dublje, sve do socket-a
Socket: sučelje između aplikacije, tj. nas programera, i TCP protokola
Sjećate se da smo završili zadnje predavanje s pojmom socket-a?
-
Odjel za matematiku 9
#!/usr/bin/env python
import socket
sock = socket.socket()
sock.connect(('maps.google.com', 80))
sock.sendall(
'GET /maps/geo?q=Alojzija%Stepinca,%Osijek,%Croatia'
'&output=json&oe=utf8&sensor=false HTTP/1.1\r\n'
'Host: maps.google.com:80\r\n'
'User-Agent: \r\n'
'Connection: close\r\n'
'\r\n')
rawreply = sock.recv(4096)print rawreply
Python implementacija našeg zadatka koristeći direktno socket
Predavanje 02
Naš prvi zadatak
Longitude + Latitude – još dublje, sve do socket-a
-
Google Maps URL vraća podatke u JSON obliku koje sadrže
u sebi tražene koordinateURLs sadrže dokumente koje možemo
dohvatiti pomoću HTTP protokola.
HTTP koristi socket-e za slanje naredbi
poput GET.
Odjel za matematiku 10Predavanje 02
Naš prvi zadatak
Stog protokola (Protocol stack)
Stog protokola u prethodnom primjeru:
Socket zna poslati i
primati tekst
-
Još malo o IP protokolu
Odjel za matematiku 11Predavanje 02
Struktura IP paketa
193.198.69.3
Podaci :
binarni string
IP paket
193.198.69.3
IP adresa se čita s lijeva na desno:
Prva dva bytea određuju organizaciju kojoj je pridružena adresa.
Npr: 193.198.*.* velikim dijelom pripada CarNet-u
Sljedeći byte određuje podmrežu na kojoj se nalazi računalo
Npr: 193.198.69.* je CarNet dodijelio našem Odjelu
Posljednji byte određuje mašinu ili servis kojemu se pristupa
-
Odjel za matematiku 12Predavanje 02
IP adresiranje
#!/usr/bin/env python
import socket
hostname = 'www.mathos.hr'
addr = socket.gethostbyname(hostname)print 'The address of', hostname, 'is', addr
Pretvaranje tekstualne adrese u IP adresu (upit DNS serveru):
IP adrese oblika:
127.*.*.*: adrese rezervirane za lokalnu mašinu na kojoj radimo
127.0.0.1 ili „localhost‟ – najčešće lokalni IP mašine na kojoj jesmo
10.*.*.* , 172.16–31.*.* , 192.168.*.* : IP adrese rezervirane za privatne
podmreže (npr. LAN tj. lokalne mreže)
Nestašica IP adresa: IPv4 vs. IPv6 standard
IPv4 : adresiranje pomoću 4 bytea
IPv6 : adresiranje pomoću 16 bytea
Npr: fe80::fcfd:4aff:fecf:ea4e
-
Odjel za matematiku 13Predavanje 02
Usmjerivanje prometa (routing)
ukoliko IP adresa izgleda poput 127.*.*.*, operacijski sustav
zna da je paket namjenjen nekoj drugoj aplikaciji na istom računalu
ukoliko IP adresa ima istu podmrežu kao i mašina sama, tada paket
nikada neće napustiti lokalnu mrežu.
u suprotnom, računalo usmjerava paket na tzv “gateway računalo”, koje
povezuje lokalnu mrežu s ostatkom Interneta. Gateway odlučuje kuda
dalje s paketom.
Na primjer,
-
Fragmentacija paketa
Odjel za matematiku 14Predavanje 02
RFC dokument koji definira Internet Protokol:
http://tools.ietf.org/html/rfc791
IP dozvoljava veličinu paketa do 64kB
Lokalna mreža dozvoljava pakete veličine do 1500 bytea
Stoga je ponekad nužna fragmentacija paketa na manje pakete
DF (don‟t fragment) flag
MTU ili “maximum transmission unit” pojedine podmreže je najveća
veličina paketa koju neka mreža može prihvatiti