Hombre Posted August 1, 2012 Report Posted August 1, 2012 *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. 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 ModuleS? 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 PCRooter IP este IP-ul de la un rooterAve?i exact 65536 de porturi dar destul de multe dintre ele sunt rezervate pentru anumite portocale luând ca exempluportul 21 pentru FTP/TCP1.1.1 Rela?ia Server-ClientServerul 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 UDPProtocolul 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 TCPTCP (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 cevaHaide?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. break14. 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 BlockingCrea?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-commandsAici sunt restul comenzilor1. 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 OrderDup? 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 Python1. 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-order1. socket . htons( x )Converte?te un 16-bit-number de la host-byte-order în network-byte-order1. socket . ntohs( x )Va urma.... Quote
Angel`z Posted August 1, 2012 Report Posted August 1, 2012 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... Quote
Hombre Posted August 1, 2012 Author Report Posted August 1, 2012 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? 1 Quote
aelius Posted August 1, 2012 Report Posted August 1, 2012 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. Quote