Introducere în programarea rețelei în Python

Acest tutorial va oferi o introducere în socket-uri în Python și modul de utilizare a modulului socket pentru a construi servere HTTP și clienți în Python. Acesta va acoperi, de asemenea, Tornado, o bibliotecă de rețea Python, care este ideală pentru sondaje lungi, WebSockets și alte aplicații care necesită o conexiune de lungă durată pentru fiecare utilizator.

Care sunt prizele?

Un soclu este o legătură între două aplicații care pot comunica între ele (fie la nivel local pe o singură mașină, fie la distanță între două mașini în locații separate).

Practic, prizele funcționează ca o legătură de comunicare între două entități, adică un server și un client. Un server va da informații solicitate de un client. De exemplu, când ați vizitat această pagină, browserul a creat un soclu și a fost conectat la server.

Modulul soclului

Pentru a crea un soclu, utilizați socket.socket () funcția, iar sintaxa este la fel de simplă:

socket de import s = socket.socket (socket_family, socket_type, protocol = 0)

Iată descrierea argumentelor:

  • socket_family: Reprezintă familia de adrese (și protocol). Poate fi fie AF_UNIX, fie AF_INET.
  • socket_type: Reprezintă tipul socket-ului și poate fi SOCK_STREAM sau SOCK_DGRAM.
  • protocol: Acesta este un argument opțional și de obicei este implicit 0.

După obținerea obiectului socket, puteți crea un server sau client după cum doriți, utilizând metodele disponibile în modulul socket.

Creați un client simplu

Înainte de a începe, să examinăm metodele socket client disponibile în Python.

  • s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
  • s.connect (): Inițiază o conexiune la serverul TCP.

Pentru a crea un nou socket, mai întâi importați metoda socket a clasei socket.

portul de import

Apoi, vom crea un soclu de flux (TCP) după cum urmează:

stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

AF_INET Argumentul indică faptul că solicitați un soclu Protocol de Internet (IP), în special IPv4. Al doilea argument este tipul de protocol de transport SOCK_STREAM pentru prize TCP. În plus, puteți crea un soclu IPv6 specificând soclul AF_INET6 argument.

Specificați serverul.

server = "localhost"

Specificați portul cu care vrem să comunicăm.

port = 80

Conectați soclul la portul unde ascultă serverul.

server_address = ((gazdă, port)) stream_socket.connect (server_address) 

Este important să rețineți că gazda și portul trebuie să fie o tuplă.

Trimiteți o cerere de date către server:

message = 'mesaj' stream_socket.sendall (mesaj)

Obțineți răspunsul de la server:

date = sock.recv (10) date de imprimare

Pentru a închide o priză conectată, utilizați metoda de închidere:

stream_socket.close ()

Mai jos este codul complet pentru Client / Server.

importați socket-ul de import sys # Creați o socket TCP / IP stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definiți host gazdă = 'localhost' # defini portul portului de comunicație = 8080 # Conectați soclul la portul în care serverul ascultă server_address = ((host, port)) print "conectare" stream_socket.connect (server_address) # Trimite mesaj de date = 'mesaj' stream_socket.sendall (message) # data răspuns = stream_socket.recv socket closed 'stream_socket.close () 

Construiți un server simplu

Acum, să aruncăm o privire la un server Python simplu. Următoarele sunt metodele serverului socket disponibile în Python.

  • s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
  • s.bind (): Leagă adresa (numele de gazdă, numărul portului) de socket.
  • s.listen (): Setează și pornește ascultătorul TCP.
  • s.accept (): Acceptă conexiunea client TCP.

Vom urma următorii pași: 

  • Creați un soclu.
  • Legați soclul la un port.
  • Începeți să acceptați conexiuni pe soclu.

Aici este programul de server.

importați socket-ul de import sys # Creați un soclu socket TCP / IP socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definiți host gazdă = 'localhost' # defini portul portului de comunicație = 8080 # Legați soclul la șoseaua portului. bind ((gazdă, port)) # Ascultați pentru conexiunile primite sock.listen (1) # Așteptați pentru o conexiune de imprimare conexiune "așteptare pentru o conexiune", client = sock.accept în bucăți mici și retransmiteți datele = connection.recv (16) print 'primite'% s ''% date dacă date: connection.sendall (data) else: print 'no data from', client # () 

Serverul este acum gata pentru conexiunile primite.

Acum rulați programele client și server în ferestre terminale separate, astfel încât acestea să poată comunica între ele.

Exit server

$ python server.py de așteptare pentru o conexiune ('127.0.0.1', 47050) conectat primit "mesaj" 

Executarea clientului

$ python client.py socket pentru mesaje de conectare închis 

Cadrul Tornado

Cadrul Tornado este una dintre bibliotecile disponibile pentru programarea în rețea în Python. În această secțiune, vom discuta această bibliotecă și vom arăta cum să o folosim pentru a construi WebSockets.

Tornado este un cadru web Python și o bibliotecă de rețea asincronă. Tornado utilizează I / O de rețea fără blocare și, prin urmare, este capabil să scaldeze la zeci de mii de conexiuni deschise. Această trăsătură o face ideală pentru interogări lungi, WebSockets și alte aplicații care necesită o conexiune de lungă durată pentru fiecare utilizator.

Să creăm un simplu Tornado WebSocket:

import tornado.ioloop import tornado.web clasa ApplicationHandler (tornado.web.RequestHandler): def get (self): self.message = message = "" "  Tornado Framework  Bine ați venit în cadrul Tornado  "" auto.write (mesaj) dacă __name__ == "__main__": application = tornado.web.Application ([(r "/", ApplicationHandler),]) application.listen (5001) tornado.ioloop.IOLoop.instance ().start() 

În codul de mai sus:

  • Definim clasa ApplicationHandler care servește ca solicitant pentru o cerere și returnează un răspuns folosind scrie() metodă.
  • principal metoda este intrarea pentru program.
  • tornado.web.Application creează o bază pentru aplicația web și ia o colecție de utilizatori, adică ApplicationHandler.
  • Aplicația ascultă pe portul 5000 și un client poate comunica cu această aplicație utilizând același port.
  • tornado.ioloop.IOLoop.instance (). start () creează un fir de blocare pentru o aplicație.

Dacă rulați aplicația, vom obține rezultatul așa cum se arată în imaginea de mai jos.

Concluzie

Până acum, trebuie să fi reușit să înțelegeți elementele de bază ale programării socket-urilor în Python și cum puteți construi un server și un client simplu. Simțiți-vă liber să experimentați prin construirea propriului client de chat. Pentru mai multe informații, vizitați documentele oficiale Python.

În plus, nu ezitați să vedeți ceea ce avem la dispoziție pentru vânzare și pentru studierea pe piața Envato și nu ezitați să adresați întrebări și să oferiți feedback-ul dvs. valoros utilizând feedul de mai jos.

Cod