7.1 Soketlər nədir?
Daha dərinə baxaq. Əvvəlcə biz request ilə işləmək öyrəndik, sonra http.client, daha sonra proxy ilə. Bəs, bundan sonra nə? Bundan sonra isə bütün bu kitabxanaların qapağının altına baxacağıq…
Soket (hərfi tərcümə — rozetka) — bu şəbəkə daxilində məlumatların göndərildiyi və qəbul edildiyi bir nöqtədir. Soketi iki proqram arasında (eyni ya ayrı maşınlarda çalışan) iki tərəfli əlaqə kanalının son nöqtəsi kimi təsəvvür etmək olar.
Soketlər bir çox şəbəkə protokollarını dəstəkləyir, amma ən çox istifadə edilən ikisi:
-
TCP(Transmission Control Protocol): Etibarlı protokol, əlaqənin qurulmasını, məlumatların bütövlüyünü və düzgün ardıcıllığını təmin edir. -
UDP(User Datagram Protocol): Əlaqəyə yönəlməyən protokol, məlumatların çatdırılmasını zəmanət altına almır, lakin bəzi tətbiqlər üçün daha sürətli və effektivdir.
Soketlər IP-adres (şəbəkədəki cihazı identifikasiya edən) və port (cihazdakı müəyyən proqram və ya xidməti göstərən) ilə identifikasiya olunur.
Vacibdir! IP-adres və port şəbəkədə proqramı tam olaraq identifikasiya edir. Bu, binanın ünvanı və mənzil nömrəsi kimidir. Binanın ünvanı (IP-adres) — şəbəkədə sizin kompüterinizin ünvanıdır, port isə — məlumat göndərib qəbul etmək üçün proqram tərəfindən istifadə edilən mənzilin nömrəsidir.
IP-adres və port haqqında daha geniş məlumat almaq üçün şəbəkə quruluşuna aid mühazirələrə baxa bilərsiniz.
Proqramın socket-lərlə işinin əsas mərhələləri:
- Socket yaratmaq: Proqram socket yaradır, protokol növünü (TCP və ya UDP) göstərir.
- Adreslə bağlılıq: Socket IP-adres və port nömrəsi ilə əlaqələndirilir ki, əlaqə yaradılması və ya məlumat göndərilməsi/qəbul etməsi üçün mövcud olsun.
- Dinləmə və əlaqə qurma (TCP üçün):
- Dinləmə: Server tərəfində socket dinləmə rejiminə keçir, gələn bağlantıları gözləyir.
- Bağlantının qurulması: Müştəri serverlə əlaqə qurur. Server bağlantını qəbul edir və müştəri ilə qarşılıqlı əlaqə üçün yeni socket yaradır.
- Məlumat mübadiləsi: Məlumat müştəri ilə server arasında ötürülür. TCP halında məlumat etibarlı şəkildə ötürülür.
- Bağlantının bağlanması: Məlumat mübadiləsi bitdikdən sonra əlaqə bağlanır.
Socket-lərin istifadəsinin üstünlükləri:
- Elastiklik: Socket-lər tətbiqlərə məlumat mübadiləsini istənilən yerdə və istənilən platformada həyata keçirməyə imkan verir.
- Performans: Socket-lər məlumatların sürətli və effektiv ötürülməsini təmin edir, xüsusən UDP istifadəsi halında.
- Etibarlılıq (TCP halında): TCP protokolu məlumatların etibarlı ötürülməsini, bütövlüyünün yoxlanmasını və itirilmiş paketlərin bərpasını təmin edir.
7.2 Socket-server yaradılması
Python-da socket-lərlə işlər dəyişməz socket modulunun köməyi ilə aparılır, hansı ki, aşağı səviyyəli şəbəkə proqramlaşdırması üçün interfeys təqdim edir.
Socket-lərin köməyi ilə socket-server - müştərilərdən sorğular alıb onlara cavab verən tətbiq/obyekt yarada bilərsiniz. Həmçinin socket-client - socket-server-ə sorğular göndərən və onlardan cavab alan tətbiq/obyekt yarada bilərsiniz.
socket-server yaratmaq üçün üç addımı yerinə yetirmək lazımdır:
- Socket-server obyekti yaradın.
- Onu hansısa IP və porta bağlayın (
bind). - Gələn mesajları dinləmə rejimini aktivləşdirin (
listen).
Kod təxminən belə görünəcək:
import socket
# Socket yaradılması
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Socket-in ünvan və porta bağlanması
server_socket.bind(('localhost', 12345))
# Gələn bağlantıların dinlənməsi
server_socket.listen(5)
print("Server bağlantı gözləyir...")
Burada socket.AF_INET şəbəkə protokolu üçün IPv4 istifadə etdiyimizi göstərir, socket.SOCK_STREAM isə TCP istifadə etdiyimizi göstərir. Bu parametrlər şəbəkə tətbiqlərinin yaradılmasında ən çox istifadə olunanlardır.
Gələn mesaj qəbul edildikdən sonra dörd addımı daha etmək lazımdır:
- Müştəri ilə bağlantı qurun (
accept). - Müştəridən sorğu (verilənlər) qəbul edin (
receive). - Müştəriyə cavab göndərin (
send) — həmçinin bəzi verilənlər. - Bağlantını bağlayın (
close).
Kod təxminən belə görünəcək:
# Yeni bağlantının qəbul edilməsi
client_socket, client_address = server_socket.accept()
print(f"Bağlantı {client_address} ilə quruldu")
# Müştəridən məlumatların alınması
data = client_socket.recv(1024)
print(f"Alındı: {data.decode('utf-8')}")
# Müştəriyə məlumatların göndərilməsi
client_socket.sendall(b'Hello, client!')
# Müştəri ilə bağlantının bağlanması
client_socket.close()
sendall() metodu send() əvəzinə istifadə olunur, çünki o, bütün məlumatların göndərilməsini təmin edir. send() metodu yalnız bir hissəsini göndərə bilər, əgər buffer dolubsa.
recv(1024)-dəki 1024 rəqəmi bir dəfəlik qəbul edə biləcəyiniz maksimum byte sayını göstərir. Bu, bir əməliyyatda işlənən məlumatların həcmini idarə etməyə kömək edir.
Sonuncu nümunənin kodu adətən sonsuz dövrdə icra edilir — server əvvəlcə sorğunu emal edir, sonra yeni sorğunu gözləyir, sonra onu emal edir və bu cür davam edir.
Əgər onu özünüzdə işə salmaq və ya yalnız tam nümunəni görmək istəyirsinizsə, baxın:
import socket
# Socket yaradılması
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Socket-in ünvan və porta bağlanması
server_socket.bind(('localhost', 12345))
# Gələn bağlantıların dinlənməsi
server_socket.listen(5)
print("Server bağlantı gözləyir...")
while True:
# Yeni bağlantının qəbul edilməsi
client_socket, client_address = server_socket.accept()
print(f"Bağlantı {client_address} ilə quruldu")
# Müştəridən məlumatların alınması
data = client_socket.recv(1024)
print(f"Alındı: {data.decode('utf-8')}")
# Müştəriyə məlumatların göndərilməsi
client_socket.sendall(b'Hello, client!')
# Müştəri ilə bağlantının bağlanması
client_socket.close()
7.3 Socket-müştərisinin yaradılması
Socket-server yaratdıq, indi isə öz socket-müştərimizi yazaq ki, o serverə müraciət etsin və cavab olaraq ondan məlumat alsın.
Bunun üçün beş addımı yerinə yetirmək lazımdır:
socket-müştərisininobyektini yaratmaq.- IP ünvanı və portumuzda yerləşən
socket-serverilə(connect)bağlantını qurmaq. - Mesajı serverə
(send)göndərmək. - Serverdən məlumatları
(receive)qəbul etmək. - Bağlantını
(close)bağlamaq.
Əslində bu göründüyündən daha asandır. Kod bu şəkildə görünəcək:
import socket
# Socket yaradılması
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Server ilə bağlantının qurulması
client_socket.connect(('localhost', 12345))
# Məlumatların serverə göndərilməsi
client_socket.sendall(b'Salam, server!')
# Serverdən məlumatların qəbul edilməsi
data = client_socket.recv(1024)
print(f"Serverdən qəbul edildi: {data.decode('utf-8')}")
# Socketin bağlanması
client_socket.close()
Əgər o tərəfdə işləyən socket-server yoxdursa və ya bağlantı kəsilibsə, onda socket.error tipli istisna meydana çıxacaq. Buna görə də istisnaları emal etməyi unutmayın.
Socketlərlə işimizi bu gün burada bitiririk.
Şəbəkə ilə hər hansı iş zamanı siz təkrar-təkrar hostlar, portlar, IP-ünvanlar, bağlantının qurulması, sorğuların dinlənməsi və sair ilə qarşılaşacaqsınız. Buna görə də bunun necə işlədiyini dərindən anlamaq həyatınızı çox asanlaşdırar və müxtəlif bilikləri bir vahid şəkildə birləşdirməyə kömək edər.
GO TO FULL VERSION