Python - Soket Programlama

Python, ağ hizmetlerine iki düzeyde erişim sağlar. Düşük bir düzeyde, hem bağlantı odaklı hem de bağlantısız protokoller için istemcileri ve sunucuları uygulamanıza olanak tanıyan temel işletim sistemindeki temel yuva desteğine erişebilirsiniz.

Python ayrıca FTP, HTTP vb. Gibi belirli uygulama düzeyindeki ağ protokollerine daha yüksek düzeyde erişim sağlayan kitaplıklara da sahiptir.

Soketler, çift yönlü bir iletişim kanalının uç noktalarıdır. Soketler bir işlem içinde, aynı makinedeki işlemler arasında veya farklı kıtalardaki işlemler arasında iletişim kurabilir. Soket oluşturmak ve kullanmak için python'daki soket modülünü kullanıyoruz.

Soketlerin kendi kelime dağarcığı vardır -

Sr.No. Terim ve Açıklama
1

Domain

Taşıma mekanizması olarak kullanılan protokol ailesi. Bu değerler, AF_INET, PF_INET, PF_UNIX, PF_X25 ve benzeri sabitlerdir.

2

type

İki uç nokta arasındaki iletişim türü, tipik olarak bağlantı odaklı protokoller için SOCK_STREAM ve bağlantısız protokoller için SOCK_DGRAM.

3

protocol

Tipik olarak sıfır, bu, bir alan ve tür içindeki bir protokolün bir varyantını tanımlamak için kullanılabilir.

4

hostname

Bir ağ arayüzünün tanımlayıcısı -

  • Bir ana bilgisayar adı, noktalı dörtlü bir adres veya iki nokta üst üste (ve muhtemelen nokta) gösteriminde bir IPV6 adresi olabilen bir dize

  • Bir INADDR_BROADCAST adresini belirten bir "<broadcast>" dizesi.

  • INADDR_ANY'yi belirten sıfır uzunluklu bir dize veya

  • Ana bilgisayar bayt sırasına göre ikili adres olarak yorumlanan bir Tamsayı.

5

port

Her sunucu, bir veya daha fazla bağlantı noktasını arayan istemcileri dinler. Bir bağlantı noktası, bir Fixnum bağlantı noktası numarası, bir bağlantı noktası numarası içeren bir dize veya bir hizmetin adı olabilir.

soket Modülü

Bir soket oluşturmak için, soket modülünde bulunan ve genel sözdizimine sahip socket.socket () işlevini kullanmalısınız -

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

İşte parametrelerin açıklaması -

  • socket_family - Bu, daha önce açıklandığı gibi AF_UNIX veya AF_INET'tir.

  • socket_type - Bu, SOCK_STREAM veya SOCK_DGRAM'dır.

  • protocol - Bu genellikle dışarıda bırakılır ve varsayılan değer 0'dır.

Soket nesnesine sahip olduğunuzda, istemci veya sunucu programınızı oluşturmak için gerekli işlevleri kullanabilirsiniz.

Sunucu Soket Yöntemleri

Sr.No. Yöntem ve Açıklama
1

s.bind()

Bu yöntem adresi (ana bilgisayar adı, bağlantı noktası numarası çifti) sokete bağlar.

2

s.listen()

Bu yöntem, TCP dinleyicisini kurar ve başlatır.

3

s.accept()

Bu, pasif olarak TCP istemcisi bağlantısını kabul eder, bağlantı gelene kadar bekler (engelleme).

İstemci Soket Yöntemleri

Sr.No. Yöntem ve Açıklama
1

s.connect()

Bu yöntem, TCP sunucusu bağlantısını aktif olarak başlatır.

Genel Soket Yöntemleri

Sr.No. Yöntem ve Açıklama
1

s.recv()

Bu yöntem, TCP mesajını alır

2

s.send()

Bu yöntem, TCP mesajını iletir

3

s.recvfrom()

Bu yöntem UDP mesajını alır

4

s.sendto()

Bu yöntem UDP mesajını iletir

5

s.close()

Bu yöntem soketi kapatır

6

socket.gethostname()

Ana bilgisayar adını döndürür.

Basit Bir Sunucu

İnternet sunucuları yazmak için, socketbir soket nesnesi oluşturmak için soket modülünde mevcut işlev. Daha sonra, bir soket sunucusu kurmak için diğer işlevleri çağırmak için bir soket nesnesi kullanılır.

Şimdi ara bind(hostname, port)verilen ana bilgisayarda hizmetiniz için bir bağlantı noktası belirtme işlevi .

Ardından, döndürülen nesnenin kabul yöntemini çağırın . Bu yöntem, bir istemci belirttiğiniz bağlantı noktasına bağlanıncaya kadar bekler ve ardından bu istemciyle olan bağlantıyı temsil eden bir bağlantı nesnesi döndürür .

#!/usr/bin/python           # This is server.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Basit Bir Müşteri

Verilen bir 12345 portuna ve verilen ana bilgisayara bağlantı açan çok basit bir istemci programı yazalım. Python'un soket modülü işlevini kullanarak bir soket istemcisi oluşturmak çok basittir .

socket.connect(hosname, port )TCP bağlantısı açar hostname üzerinde port . Bir soket açtıktan sonra, herhangi bir IO nesnesi gibi okuyabilirsiniz. Bittiğinde, bir dosyayı kapatacağınız için onu kapatmayı unutmayın.

Aşağıdaki kod, belirli bir ana bilgisayara ve bağlantı noktasına bağlanan, soketten mevcut verileri okuyan ve ardından çıkan çok basit bir istemcidir -

#!/usr/bin/python           # This is client.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

Şimdi bu server.py'yi arka planda çalıştırın ve ardından sonucu görmek için client.py'nin üzerinde çalıştırın.

# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py

Bu, aşağıdaki sonucu verecektir -

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

Genel URL'li Soket

Aşağıdaki örnekte, sunucu ve ana bilgisayar adı ayrıntılarının adres bilgilerini bulmak için soket modülünden birkaç yöntem kullanıyoruz.

import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()

Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alıyoruz -

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP