Jump to content
Hombre

Python Network Communication

Recommended Posts

*ACEST TUTORIAL ESTE DOAR TRADUS DE MINE,NU EU SUNT AUTORUL

ORIGINALULUI TUTORIAL!

SCUZATI GRESELILE GRAMATICALE,O SA LE CORECTEZ IN CEL MAI SCURT TIMP POSIBIL!

Cerin?e:

*-Cuno?tin?ele de baz? în materie de Python.

*-Python instalat.

1.0 Re?eaua de comunicare

Re?eaua de comunicare poate fi împ?r?it? în 7 "straturi"

Ilustra?ia de mai jos arat? o imagine simplificat? de OSI,care arat? ierarhia protocoalelor.

osi.gif

Protocoalele ?i rolul acestora :

*FTP: Procesarea de transfer al fi?ierelor

*SMTP: Trimiterea mailurilor

*POP3: Primirea mailurilor

*IMAP4: Primirea mailurilor

*Telnet: Terminal Emulation

*HTTP: Trimiterea de fi?iere text (websiteuri ca exemplu)

*TCP: Protocolul de baz? cu conexiunea orientat? spre re?ea

*UDP: Protocol de baz? f?r? conexiune de re?ea

*IP: F?r? conexiune de re?ea protocol

1.1.0 Socket Module

S? vorbim mai întâi un pic despre IP-uri ?i PORTURI

IP este prescurtarea de la Internet Protocol, iar acesta arat? cam a?a: "127.0.0.1"

Fiecare parte dintr-un IP reprezint? un octet(care poate fi între 0 ?i 255) , astfel IP fiind alc?tuit din 4 octe?i!

* Exist? 2 tipuri de IP:

* * -LOCAL IP

* * -ROOTER IP

Local IP este IP-ul de la propriul t?u PC

Rooter IP este IP-ul de la un rooter

Ave?i exact 65536 de porturi dar destul de multe dintre ele sunt rezervate pentru anumite portocale luând ca exempluportul 21 pentru FTP/TCP

1.1.1 Rela?ia Server-Client

Serverul este cel care furnizeaz? datele(RSTcenter.com spre exemplu) iar Clientul este cel care dore?te datele de la server(Tu de exemplu)

Conexiunea la un server o pute?i realiza accesând domeniul(Google.ro) sau IP-ul s?u (74.125.79.106)

1.1.2 UDP

Protocolul UDP a fost creat ca alternativ? la protocolul pentru a trimite limbajul uman,acesta fiind ?i mult mai rapid decât TCP.

Haide?i s? facem un script pentru a trimite un mesaj c?tre server:

1. import socket
2. s = socket . socket(socket . AF_INET, socket . SOCK_DGRAM)
3.
4. ip = raw_input("Enter Server IP: ")
5. msg = raw_input("Message: ")
6.
7. s. sendto( msg ,( ip ,50000))
8. s. close()

Primul rand este un socket creat.Pe al doilea rând trebuie s? introduce?i IP-ul serverului unde vre?i s? fie trimis mesajul iar pe al treilea rând mesajul."s.sendto()" va trimite mesajul la IP-ul dat iar cu "s.close ()" se va termina conexiunea la server.

Dar ?i tu ai nevoie de un server deasemenea:

1. import socket 
2. s = socket . socket(socket . AF_INET,socket . SOCK_DGRAM)
3.
4. try :
5. s. bind(("",500))
6. while True :
7. data , address = s. recvfrom(1024)
8. print "[%s] %s" % ( address [0], data )
9. finally :
10. s. close()

Am creat ?i aici un socket din nou.În "try" ?i "finally"*exemplul este legat de o adres? ("" este pentru fiecare adres? IP) ?i un port (50000).În bucla "while true" a?teapt? s? primeasc? informa?ii.Scriptul poate fi închis terminând sarcina 'finishing the task'.Apoi se va termina conexiunea în "finally" de c?tre"s.close ()"

1.1.3 TCP

TCP (Transmission Control Protocol) nu este un produs care s? combat? UDP ci mai degrab? o îmbun?t??ire.De exemplu, dac? nu primi?i unii bi?i sau octe?i, în loc de UDP, TCP le trimite din nou. Este mult mai fiabil decât UDP,dar are nevoie de mai mult timp pentru a trimite ceva

Haide?i s? facem 2 scripturi:

* Primul,serverul:

1. import socket 
2. s = socket . socket(socket . AF_INET, socket . SOCK_STREAM)
3. s. bind(("", 50000))
4. s. listen(1)
5.
6. try :
7. while True :
8. connection , address = s. accept()
9. while True :
10. data = connection. recv(1024)
11. if not data:
12. connection. close()
13. break
14.
15. print "[%s] %s" % ( address [0], data )
16. msg = raw_input("Answer: ")
17. connection. send( msg )
18. finally :
19. s. close()

Singura diferen?? în script-ul dintre TCP si UDP este al doilea parametru la "socket.socket ()".Dup? ce am facut exemplul "S" trebuie s?-l leg?m de o adres? ?i un port."" Este ca în script-urile de mai sus pentru fiecare IP."listen"este pentru a asculta o cerere de conexiune. "listen" ar trebui s? aib? un parametru.

Apoi bucla "While true",Python a?teapt? pentru o cerere de conexiune ?i cu "acept ()" vom accepta cererea.Urm?toarea bucl? "While true" are dou? p?r?i: "connection.recieve" a?teapt? un mesaj de la client.Dac? ob?ine?i un ?ir gol, atunci clientul încheiat conexiunea.În cazul în care se întâmpl? a?a ceva, script-ul va s?ri înapoi în prima bucl? "While true".Dac? mesajul nu este gol, se va imrima ?i serverul poate introduce un mesaj pentru a trimite înapoi.

Acum încerca?i s? scrie?i script-ul clientului.

Uita?i aici cum ar trebui s? arate script-ul:

1. import socket 
2. ip = raw_input("IP-Address: ")
3. s = socket . socket(socket . AF_INET, socket . SOCKSTREAM)
4. s. connect(( ip , 50000)
5.
6. try :
7. while True :
8. msg = raw_input("Message: ")
9. s. send( msg )
10. answer = s. recv(1024)
11. print "[%s] %s" % ( ip , answer )
12. finally :
13. s. close()

Cel mai important lucru în acest script este s? scrie?i prima dat? message-input ?i message-sending iar apoi scrie?i*"recv ()".În caz contrar, e?i Clientul ?i Serverul ar a?tepta într-o bucl? pentru un mesaj care nu va veni!

Nu voi explica acest script acum, pentru c? totul este ca în script-urile de mai sus. Cea mai mare porblem? în acest?aplica?ie de chat este c? nu po?i scrie mesaje unul dup? altul.Aceast? problem? ar putea fi rezolvat? cu 'threading' , sau cu modulul "Thread".

1.1.4 Sockets Blocking

Crea?i un socket este în modul de blocare. Asta înseamn? c? fiecare func?ie a?teapt? pân? la sarcina se

termin?.Func?ia "Recv"de exemplu, ar putea bloca lipsurile din script pân? la un mesaj este primit. Uneori,acest lucru este necesar, dar, dac? ave?i mai mult de un socket sau utiliza?i threading, atunci acest lucru ar fi o problem?.Ca s? rezolva?i aceast? problem? pune?i socketul în modul "non-block".Un parametru cu un socket ar stabili modu de blocare din nou.

Dar:

-"Recv" ?i "recvfrom" imprim? un socket.error este o excep?ie atunci când nu exist? date recieving, dac? "puffer" este plin, atunci "send" ?i "SendTo", vor imprima o excep?ie de eroare ?i de date poate nu se vor trimite.

-"connection" nu a?teapt? pân? conexiunea se realizeaz? ?i "send" p?streaz? mesajul trimis care poate nu a fost trimis.

Pute?i utiliza "connect_ex ()" ce pastreaza mesajul, v? va oferi un profit-valoarea 0 în cazul în care conexiunea este construit?.

1.1.5 Socket-commands

Aici sunt restul comenzilor

1. socket . getfqdn([ name ])

1. socket . gethostbyname( hostname )

1. socket . gethostname()

1. socket . getservbyport( port )

1. socket . setdefaulttimeout( timeout)

1. s. getpeername()

1. s. sendall( msg )

1. s. setblocking( flag )

1.1.6 Network Byte Order

Dup? cum ?ti?i, fiecare sistem de operare cite?te ?i scrie ?iruri de caractere într-o ordine de byte diferit?.. Atâta timp cât utiliza?i numai caractere ASCII nu va fi nici o problem?, dar dac? dori?i s? trimite?i un mesaj cu caractere speciale, cum ar fi "ä", "{", "[" sau altele,atunci ar putea fi o problem? în cazul în care computerul serverului/Clientului utilizeaz? alt sistem de operare. Pentru a rezolva

aceast? problem? se folose?te network-byte-order.

Acum, trebuie doar pentru s? converte?ti binary de la host-byte-order în network-byte-order înainte de a trimite.

Pute?i converti byte-order cu Python

1. socket . htonl( x )

Converte?te un 32-bit-number de la host-byte-order în network-byte-order

  1. socket . ntohl( x)

Converte?te un 32-bit-number de la network-byte-order în host-byte-order

1. socket . htons( x )

Converte?te un 16-bit-number de la host-byte-order în network-byte-order

1. socket . ntohs( x )

Va urma....

Link to comment
Share on other sites

LOL "va urma" cand faci un topic pune tot continuthu de la inceput ca nu o.sa stau sa iti verific topicul sa vad daca ai mai adaugat cva...

M? ab?in s? î?i spun ceva,dup? ce c? am pus aici tradus,ca de?tep?ii s? nu se mai chinuie , vrei s? traduc c?teva pagini ?i imediat nu?

  • Upvote 1
Link to comment
Share on other sites

LOL "va urma" cand faci un topic pune tot continuthu de la inceput ca nu o.sa stau sa iti verific topicul sa vad daca ai mai adaugat cva...

Ba futu-va sfintenia sufletelor, pune omul tutoriale si o ardeti cu rahaturi de genul asta? Promit sa va dau banuri in ordine alfabetica daca mai vad comentarii de genul. Puteti sa fiti aici de la geneza ca nu o sa tin cont.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...