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.
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.
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:
După obținerea obiectului socket, puteți crea un server sau client după cum doriți, utilizând metodele disponibile în modulul socket.
Î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 ()
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:
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.
$ python server.py de așteptare pentru o conexiune ('127.0.0.1', 47050) conectat primit "mesaj"
$ python client.py socket pentru mesaje de conectare închis
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:
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.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.
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.