Mrežno programiranje - IPAQ...
Transcript of Mrežno programiranje - IPAQ...
Mrežno programiranje
O računalnim mrežama
dva ili više međusobno povezanih uređaja koji mogu razmjenjivati podatke
Ethernet – IEEE 802.3
načini spajanja (najčešći):
UTP kablovima
bežično (wireless)
protokoli:
IPv4 – 4 8-bitovna broja
IPv6 – 8 16-bitovnih brojeva
hostname = simboličko ime računala
Mrežna komunikacija
vrste računala
poslužitelji
klijenti
razmjena paketa
zaglavlje (header)
IP adresa primatelja, IP adresa pošiljatelja,
protokol, duljina,…
podatak (data)
Mrežna komunikacija
Mrežna komunikacija
algoritmi usmjeravanja paketa:
Dijkstrin algoritam, algoritam poplave, algoritam stalnog usmjeravanja, algoritam nasumičnog usmjeravanja,…
Razine mreže
Fizički sloj (driveri,...)
Mrežni sloj (IP,...)
Trtansportni sloj (TCP, UDP...)
Aplikacijski sloj (FTP, Telnet, HTTP,...)
Portovi
više aplikacija koje u nekom trenutku šalju ili primaju podatke s mreže (web, ftp, peer-to-peer)
port – "vrata" kroz koja aplikacija prima /šalje podatke
broj portova: 65536
prvih 1024 porta zauzeti
http: port 80
ftp: port 20 i 21
Telnet: port 23
…
Modul socket
modul: socket
funkcije metoda socket:
gethostname() – host name računala na kojem
se funkcija izvodi
gethostbyname(name) – IP adresa računala čiji
je hostname name
gethostbyaddr(ipadress) – podaci o računalu
na osnovu IP adrese
Modul socket - primjer
>>> from socket import *
>>> gethostbyname('www.carnet.hr')
'161.53.160.25'
>>> gethostbyaddr('161.53.160.25')
('www.CARNet.hr', [], ['161.53.160.25'])
Socket
komunikacija point-to-point
TCP protokol
podaci putuju "kanalom"
na ishodišnom računalu pišemo podatke na kraj
kanala (socket)
na odredišnom računalu podatke čitamo na
drugom kraju kanala (socketa)
putovanje kanala kanalom nas ne zanima
Socket
socketi
Primjer jednostavne komunikacije poslužitelj
kreira socket na nekom portu
kreira novi socket za komunikaciju s klijentom
čita poruku sa socketa
sva slova u poruci zamijeni odgovarajućim
velikim slovima
piše poruku na socket
zatvara socket
klijent
kreira novi socket za komunikaciju sa
serverom
učitava poruku sa standardnog ulaza
piše poruku na socket
čita poruku sa socketa
ispisuje poruku na standardni izlaz
zatvara socket
čeka zahtjev klijenta
Metode klase socket bind((host, port)) – povezuje (stvara) socket s računalom
(poslužiteljem)
listen(n) – čeka spajanje klijenta, n – najveći broj klijenata koji mogu čekati u redu (najčešće 5)
accept() – prihvaća klijenta te nakon spajanja vraća par (conn, address) pri čemu je:
conn - socket objekt koji će omogućavati komunikaciju s klijentom
adress – adresa klijenta
connect((host, port)) – spaja se na zadani port određenog hosta (klijent)
send(s) – piše poruku na socket
recv(maxsize) – čita sa socketa poruku maximalne veličine maxsize bytova,
close() – zatvara socket
Primjer jednostavne komunikacije poslužitelj
kreira socket na nekom portu
kreira novi socket za komunikaciju s klijentom
čita poruku s socketa
sva slova u poruci mijenja odgovarajućim
velikim slovima
piše poruku na socket
zatvara socket
klijent
kreira novi socket za komunikaciju sa
serverom
učitava poruku sa standardnog ulaza
piše poruku na socket
čita poruku sa socketa
ispisuje poruku na standardni izlaz
zatvara socket
čeka zahtjev klijenta
bind
listen
accept
read
write
close
connect
write
read
close
Primjer 1:
Kreirajmo klijent-poslužitelj aplikaciju koja će raditi na sljedeći način:
- poslužiteljski dio aplikacije:
- čeka klijenta
- preuzima poruku od klijenta
- poruku od klijenta pretvara u velika slova te ju ponovo šalje klijentu
- klijentski dio aplikacije:
- spaja se na poslužitelj
- učitava poruku sa standardnog ulaza
- učitanu poruku šalje poslužitelju
- učitava poruku s poslužitelja te ju ispisuje na izlaz
Primjer 1 - poslužitelj:
from socket import *
s = socket()
s.bind(('posluzitelj', 10000))
s.listen(5)
print('Čekam klijenta....')
c, t = s.accept()
print('Spojen klijent {}'.format(t))
p = c.recv(1024).decode('utf-8')
print('Klijent kaže {}'.format(p))
p = p.upper()
print('Šaljem klijentu {}'.format(p))
c.send(p.encode('utf-8'))
c.close()
s.close()
Primjer 1 - klijent:
from socket import *
s = socket()
print('Spajam se...')
s.connect(('posluzitelj', 10000))
print('Spojio sam se')
poruka = input('Upiši poruku: ')
s.send(poruka.encode('utf-8'))
print(s.recv(1024).decode('utf-8'))
s.close()
Primjer 1 - rješenje:
Prenošenje binarnih datoteka putem mreže
open(ime_datoteke, 'rb')
šaljemo cijelu datoteku istovremeno, bez kodiranja – niz
bajtova
kako znamo koliko paketa na klijentu trebamo učitati?
u prvom paketu klijentu pošaljemo vličinu datoteke (V)
čitamo pakete sve dok ne učitamo V bajtova
niz bajtova (B) pretvaramo u sliku naredbom:
PhotoImage(data = base64.encodestring(B))
sliku prikazujemo na crtačem platnu (Canvas):
c.create_image(s, d, image = slika)
Primjer 2:
Kreirajmo klijent-poslužitelj aplikaciju koja će raditi na sljedeći način:
poslužitelj:
čeka klijenta ► klijent spojen ► šalje klijentu popis datoteka ► čeka zahtjev za datotekom od klijenta ► zahtjev primljen ► šalje veličinu datoteke ► šalje datoteku
klijent:
spaja se na poslužitelj ► prima listu datoteka i prikazuje je korisniku ► korisnik odabere datoteku ► šalje naziv datoteke poslužitelju ► od poslužitelja preuzima veličinu datoteke ► od poslužitelja preuzima cijelu datoteku ► prikazuje datoteku na ekranu ► ako korisnik odabere sprema datoteku
Primjer 2 - poslužitelj:
Primjer 2 - klijent:
Primjer 2 - rješenje: