9.11. Soket nesneleri¶
Taşıma katmanına Python arayüzü socket.socket sınıfıdır. Bir soket, bir ağ konuşmasının bir uç noktasını temsil eder – bir adres, bir port ve konuşmanın üzerinde çalıştığı protokol (UDP veya TCP). Donanım kontrol bölümleri, bir tel üzerinde konuşmak için UART örnekleri açtı; bu bölüm, ağ üzerinde konuşmak için socket örnekleri açar. Biçim aynıdır; alttaki hizmet yalnızca çok daha yeteneklidir.
9.11.1. Bir soket oluşturma¶
Bir soketi üç argüman tanımlar: hangi adres ailesini konuştuğu, hangi soket türünü sunduğu ve hangi protokolü kullandığı. Varsayılanlar, bu bölümün geri kalanının kullandığı durumları kapsar:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IPv4 TCP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # IPv4 UDP
Uygulamanın neredeyse her durumda arasından seçtiği iki sabit:
AF_INET– IPv4 adresleri (sayısal bir IP artı bir port). En yaygın seçim.AF_INET6, IPv6 eşdeğeridir.SOCK_STREAM– bir TCP bağlantısı, güvenilir bayt akışı.SOCK_DGRAM, UDP eşdeğeridir.
Üçüncü argüman (protokol) sıfırda bırakılır, bu da ilk ikisine göre doğru varsayılanı seçer. Tam yapıcı socket — socket modülü üzerinde belgelenmiştir.
9.11.2. Bir soketteki adresler¶
Bir soket adresi, bir (host, port) demetidir:
("192.168.1.50", 80)
("0.0.0.0", 8000)
Host, dize olarak IP adresidir. Port, Portlar üzerinde ele alınan 16 bitlik tam sayıdır.
Bilinmeye değer birkaç özel host dizesi vardır:
"0.0.0.0", “bu cihazdaki her IPv4 arayüzü” anlamına gelir. Bu adrese bağlanmış bir sunucu, kameranın sahip olduğu herhangi bir adreste bağlantıları kabul eder."127.0.0.1"localhost adresidir – ona giden trafik cihazdan asla çıkmaz. Test için kullanışlıdır."255.255.255.255"yerel yayın adresidir. Ona gönderilen bir UDP datagramı, yerel segmentteki her cihaza gider.
"example.com" gibi alan adları, bir soket adresinde geçerli host dizeleri değildir. Önce bir IP’ye çözümlenmeleri gerekir; Adlar ve DNS, bunu yapan getaddrinfo() çağrısını kapsar.
9.11.3. İki rol¶
Bir soketin yaşam döngüsü, konuşmanın hangi tarafında olduğuna bağlıdır. Bir istemci soketi, bilinen bir sunucuyla konuşmak için connect() (veya UDP için yalnızca sendto()) çağırır. Bir sunucu soketi, bir portu sahiplenmek için bind() çağırır, ardından gelen trafiği almak için ya listen() ve accept() (TCP için) ya da recvfrom() (UDP için) çağırır.
Her iki durumda da aynı socket yapıcısı kullanılır; yalnızca sonrasında çağrılan yöntemler farklıdır. Sonraki üç sayfa pratik kalıpları adım adım anlatır:
UDP soketleri – datagram gönder ve al.
TCP soketleri – TCP istemci ve sunucu.
asyncio ile soketler – yukarıdaki her şey, ancak bir
asyncioolay döngüsü içinde.
9.11.4. Bir soketi kapatma¶
Her soket, küçük bir işletim sistemi durumu parçası tutar (bir port rezervasyonu, arabellekler, bağlantının TCP durumu). Uygulama onunla işini bitirdiğinde, close() bu durumu serbest bırakır. Unutulmuş bir soket, zamanla biriken yavaş bir sızıntıdır; bağlantı açan bir döngüde bir close çağrısını kaçırmak, sonunda kameranın kullanılabilir soket havuzunu tüketecektir.
En temiz kalıp with ifadesidir:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(addr)
s.send(b"GET / HTTP/1.0\r\n\r\n")
...
# socket is closed automatically here, even on error
Soketler, Python genel bakışında ele alınan bağlam yöneticisi protokolünü uygular, dolayısıyla with bloğu, bloğun normal olarak mı yoksa bir istisna fırlatarak mı çıktığına bakılmaksızın close() çağrısının yapılmasını garanti eder.
9.11.5. socket referansı¶
Bu ve sonraki sayfalar API’yi anlatı biçiminde adım adım gösterir. Her yöntemin, her bayrağın ve modülün sunduğu her sabitin tam argüman düzeyindeki referansı için bkz. socket — socket modülü. Referans, ayrıca bu bölümün ele almadığı daha az yaygın işlemlere (soket seçenekleri, çok noktaya yayın grup üyeliği, IPv6 kapsam kimlikleri) bakılacak yerdir.