Programare socket în Python: exemple de client, server și peer

Blog

Socket-urile (aka socket programming) permit programelor să trimită și să primească date, bidirecțional , în orice moment dat. Acest tutorial parcurge modul în care puteți trimite date din dispozitiv-la-dispozitiv , client-server , și vice versa folosind programarea socketului în Python.

De ce să utilizați socketuri pentru a trimite date?

Aplicațiile conectate la internet care trebuie să funcționeze în timp real beneficiază foarte mult de implementarea prize în lor cod de rețea . Câteva exemple de aplicații care utilizează programare socket sunt:

  • Pagini web care afișează notificări live (Facebook, Twitch, eBay)
  • Jocuri online multiplayer (League of Legends, WoW, Counter Strike)
  • Aplicații de chat (WhatsApp, WeChat, Slack)
  • Tablouri de bord în timp real (Robinhood, Coinbase)
  • Dispozitive IoT (Nest, August Locks)

Python, spre deosebire de JavaScript, este un limbaj care se execută sincron . De-aceea asincio a fost dezvoltat - pentru a face Python mai robust, în special pentru natura programării socketului.

Cu prizele de streaming, datele pot fi trimise sau primite în orice moment. În cazul în care programul dvs. Python se află în mijlocul executării unui cod, altul fire poate gestiona noile date de socket. Bibliotecilor le place asincio implementați mai multe fire, astfel încât programul dvs. Python să poată funcționa într-un mod asincron.

Tutorial de programare Python Socket

În mod nativ, Python oferă un clasa soclu astfel încât dezvoltatorii să poată implementa cu ușurință obiecte de soclu în codul lor sursă. Pentru a utiliza un obiect socket în programul dvs., începeți prin importarea bibliotecii socket. Nu este nevoie să-l instalați cu un manager de pachete, acesta iese din cutie cu Python.

import socket

Acum putem crea obiecte socket în codul nostru.

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

Acest cod creează un obiect socket pe care îl stocăm în variabila sock. Constructorului i se oferă un parametru de familie și respectiv de tip. Parametrul familiei este setat la valoarea implicită, care este Format adrese Internet .

cum să-mi repar facebook-ul

Parametrul de tip este setat la Socket Stream , de asemenea implicit, care permite fluxuri octet secvențiale, fiabile, bidirecționale, bazate pe conexiune TCP 1 .

Odată ce avem un obiect socket inițializat, putem folosi câteva metode pentru a deschide un conexiune , trimite date, a primi date și, în cele din urmă închide conexiunea.

## Connect to an IP with Port, could be a URL sock.connect(('0.0.0.0', 8080)) ## Send some data, this method can be called multiple times sock.send('Twenty-five bytes to send') ## Receive up to 4096 bytes from a peer sock.recv(4096) ## Close the socket connection, no more data transmission sock.close()

Python Socket Server

Acum, că cunoaștem câteva metode de transmitere a octeților, să creăm un program client și server cu Python.

import socket serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.bind(('0.0.0.0', 8080)) serv.listen(5) while True: conn, addr = serv.accept() from_client = '' while True: data = conn.recv(4096) if not data: break from_client += data print from_client conn.send('I am SERVER ') conn.close() print 'client disconnected'

Acest cod face un obiect socket și îl leagă de acesta portul localhost’s 8080 ia o server socket . Când clienții se conectează la această adresă cu o conexiune socket, serverul ascultă datele și le stochează în variabila de date.

web.xml în Spring Boot

Apoi, programul înregistrează datele clientului utilizând print, și apoi trimite un șir către client: Sunt SERVER .

Să aruncăm o privire asupra codului clientului care ar interacționa cu acest program server.

Client Python Socket

Aici este client cod demo socket.

import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('0.0.0.0', 8080)) client.send('I am CLIENT ') from_server = client.recv(4096) client.close() print from_server

Acest client deschide o conexiune socket cu serverul, dar numai dacă programul server rulează în prezent . Pentru a testa acest lucru singur, va trebui să utilizați 2 ferestre terminale în același timp.

Reacționează imaginea de fundal în stil inline

Apoi, clientul trimite câteva date către server: Sunt CLIENT

Apoi, clientul primește câteva date pe care le anticipează de la server.

Terminat! Acum puteți începe streaming de date între clienți și servere folosind unele programe de rețea Python de bază.

Cum trimiteți date între clienți?

Trimiterea datelor între 2 sau mai multe dispozitive client prin internet este dificil. Datorită protecțiilor implementate de securitatea rețelei, nu toate dispozitivele conectate la internetul mondial au o adresă de protocol de internet (IP) accesibil publicului.

Aceasta înseamnă că codul Python pe care l-am implementat nu va fi 100% fiabil pentru trimiterea de date peer-to-peer în aplicația noastră în timp real. Cum reușim fiabilitate și viteză la transmiterea date de la egal la egal ?

Acest lucru poate fi realizat folosind un server în mijloc . Dispozitivele client care utilizează internetul se pot conecta la un server cu o adresă IP publică (sau un domeniu de site-ul web). Apoi, acest broker din mijloc poate transmite mesaje direcționate către unul sau mai mulți clienți.

instrument de reparare a imprimantei pdf Quickbooks

PubNub face acest lucru cel mai bine cu API Pub / Sub . Este rapid, fiabil, sigur și ușor de implementat orice dispozitiv client . Indiferent dacă aveți un server Python, un site web JavaScript sau orice altceva între ele, puteți utiliza PubNub pentru a trimite date oricui din sub 250ms .

Cu One-to-Many , Unu la unu , sau Mulți-la-mulți , PubNub scalează automat pentru a suporta orice încărcare a aplicației. Utilizarea API-ului deschide o conexiune instantaneu, permanentă, între toți clienții care au cheile API Pub / Sub. Aceasta realizează aceleași obiective ca o conexiune socket.

PubNub și Python cu o conexiune SSL

Iată un exemplu de date de la egal la egal care este trimis cu PubNub, pe un singur canal, cu SSL . Vă puteți gândi la asta ca la trimiterea de date printr-un socket TCP. Când vă înscrieți pentru un cont gratuit PubNub, puteți utiliza practic un cont număr infinit de canale pentru a trimite mesaje în timp real. Înainte de a încerca codul, asigurați-vă că creați un cont gratuit PubNub.

Clientul 1

from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() pnconfig.publish_key = 'your pubnub publish key here' pnconfig.subscribe_key = 'your pubnub subscribe key here' pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): print 'from device 2: ' + message.message pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels('chan-1').execute() ## publish a message while True: msg = raw_input('Input a message to publish: ') if msg == 'exit': os._exit(1) pubnub.publish().channel('chan-1').message(str(msg)).pn_async(my_publish_callback)

Clientul 2

Șirurile pot fi introduse pe linia de comandă pentru aceste 2 programe client. Dimensiunea maximă a mesajului pentru publicarea PubNub este de 32 KB. Utilizați 2 ferestre de terminal pentru a încerca codul!

from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() pnconfig.publish_key = 'your pubnub publish key here' pnconfig.subscribe_key = 'your pubnub subscribe key here' pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): print 'from device 1: ' + message.message pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels('chan-1').execute() ## publish a message while True: msg = raw_input('Input a message to publish: ') if msg == 'exit': os._exit(1) pubnub.publish().channel('chan-1').message(str(msg)).pn_async(my_publish_callback)

Tot codul din această postare este găzduit pe GitHub în depozitul Python Socket Demo .

#python # dezvoltare web

www.pubnub.com

Programare socket în Python: exemple de client, server și peer

Programare socket în Python: Exemple de client, server și peer - Acest tutorial prezintă modul în care puteți trimite date de la dispozitiv la dispozitiv, client la server și viceversa utilizând programarea socket în Python.