Deze tutorial geeft een inleiding tot sockets in Python en hoe je de socket-module kunt gebruiken om HTTP-servers en -clients in Python te bouwen. Het zal ook betrekking hebben op Tornado, een Python-netwerkbibliotheek die ideaal is voor lange polling, WebSockets en andere applicaties die een langdurige verbinding met elke gebruiker vereisen..
Een socket is een koppeling tussen twee applicaties die met elkaar kunnen communiceren (lokaal op een enkele machine of op afstand tussen twee machines op afzonderlijke locaties).
Kort gezegd fungeren sockets als een communicatieverbinding tussen twee entiteiten, d.w.z. een server en een cliënt. Een server deelt informatie uit die wordt aangevraagd door een klant. Wanneer u bijvoorbeeld deze pagina hebt bezocht, heeft de browser een socket gemaakt en verbinding gemaakt met de server.
Om een socket te maken, gebruikt u de socket.socket ()
functie, en de syntaxis is zo simpel als:
import socket s = socket.socket (socket_family, socket_type, protocol = 0)
Hier is de beschrijving van de argumenten:
Nadat u uw socketobject hebt verkregen, kunt u naar wens een server of client maken met behulp van de methoden die beschikbaar zijn in de socketmodule.
Laten we, voordat we aan de slag gaan, eens kijken naar de client socket-methoden die beschikbaar zijn in Python.
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect ()
: Start een TCP-serververbinding op.Als u een nieuwe socket wilt maken, importeert u eerst de socket-methode van de socketklasse.
import socket
Vervolgens maken we een stream (TCP) socket als volgt:
stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
De AF_INET
argument geeft aan dat u een Internet Protocol (IP) -aansluiting aanvraagt, met name IPv4. Het tweede argument is het type transportprotocol SOCK_STREAM
voor TCP-sockets. Bovendien kunt u ook een IPv6-socket maken door de socket op te geven AF_INET6
argument.
Geef de server op.
server = "localhost"
Geef de poort op waarmee we willen communiceren.
poort = 80
Verbind de aansluiting met de poort waar de server luistert.
server_address = ((host, poort)) stream_socket.connect (server_address)
Het is belangrijk op te merken dat de host en poort een tuple moeten zijn.
Stuur een gegevensverzoek naar de server:
message = 'message' stream_socket.sendall (bericht)
Krijg het antwoord van de server:
data = sock.recv (10) print gegevens
Om een aangesloten socket te sluiten, gebruik je de methode sluiten:
stream_socket.close ()
Hieronder staat de volledige code voor de Client / Server.
import socket import sys # Maak een TCP / IP socket stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definieer host host = 'localhost' # definieer de communicatie poort poort = 8080 # Verbind de socket met de poort waar de server luistert naar server_address = ((host, poort)) print "connecting" stream_socket.connect (server_address) # Send data message = 'bericht' stream_socket.sendall (bericht) # response data = stream_socket.recv (10) print data print ' socket gesloten 'stream_socket.close ()
Laten we nu eens kijken naar een eenvoudige Python-server. De volgende zijn de socket-servermethoden die beschikbaar zijn in Python.
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.bind ()
: Bindt adres (hostnaam, poortnummer) aan socket.s.listen ()
: Configureert en start TCP listener.s.accept ()
: Accepteert TCP-clientverbinding.We zullen de volgende stappen volgen:
Hier is het serverprogramma.
import socket import sys # Maak een TCP / IP socket sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definieer host host = 'localhost' # definieer de communicatie poort poort = 8080 # Verbind de socket met de poort sok. bind ((host, poort)) # Luister naar inkomende verbindingen sock.listen (1) # Wacht op een verbinding print 'wacht op een verbinding' verbinding, client = sock.accept () print client, 'connected' # Ontvang de data in kleine stukjes en verzend het opnieuw data = connection.recv (16) print 'received'% s "'% data if data: connection.sendall (data) else: print' no data from ', client # Sluit de connection connection.close ()
De server is nu klaar voor inkomende verbindingen.
Voer nu de client- en serverprogramma's in afzonderlijke terminalvensters uit, zodat ze met elkaar kunnen communiceren.
$ python server.py wacht op een verbinding ('127.0.0.1', 47050) verbonden ontvangen 'bericht'
$ python client.py verbindingsbericht socket gesloten
Het Tornado-raamwerk is een van de bibliotheken die beschikbaar zijn voor netwerkprogrammering in Python. In deze sectie bespreken we deze bibliotheek en laten we zien hoe je deze kunt gebruiken om WebSockets te bouwen.
Tornado is een Python-webraamwerk en een asynchrone netwerkbibliotheek. Tornado maakt gebruik van de niet-blokkerende netwerk-I / O en kan dus opschalen naar tienduizenden open verbindingen. Deze eigenschap maakt het ideaal voor lange polling, WebSockets en andere applicaties die een langdurige verbinding met elke gebruiker vereisen.
Laten we een eenvoudige Tornado WebSocket maken:
import tornado.ioloop import tornado.web class ApplicationHandler (tornado.web.RequestHandler): def get (self): self.message = message = "" "Tornado Framework Welkom bij het Tornado-raamwerk "" "self.write (bericht) als __name__ ==" __main__ ": application = tornado.web.Application ([(r" / ", ApplicationHandler),]) application.listen (5001) tornado.ioloop.IOLoop.instance ().begin()
In de bovenstaande code:
ApplicationHandler
die fungeert als de handler voor een verzoek en een antwoord retourneert met behulp van de schrijven()
methode.hoofd
methode is de invoer voor het programma.tornado.web.Application
maakt een basis voor de webtoepassing en neemt een verzameling handlers, d.w.z. ApplicationHandler.tornado.ioloop.IOLoop.instance (). start ()
maakt een niet-blokkerende thread voor een toepassing.Als we de applicatie uitvoeren, krijgen we het resultaat zoals weergegeven in de onderstaande schermafbeelding.
Inmiddels moet je de basis van socketprogrammering in Python hebben begrepen en hoe je een eenvoudige server en client kunt bouwen. Experimenteer gerust door uw eigen chatclient te bouwen. Ga voor meer informatie naar de officiële Python-documenten.
Aarzel ook niet om te zien wat we beschikbaar hebben voor de verkoop en om te studeren in de Envato-markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.