Python, güçlü bir dizi modül ve kitaplık ile ağ programlamayı destekler. Bu makalede, Python ile ağ programlamaya giriş yapacağız ve en yaygın kullanılan ağ programlama modüllerini keşfedeceğiz.
Python ile Ağ Programlamaya Giriş
Ağ programlaması, bilgisayar sistemleri arasında iletişim kurmak için yazılım geliştirmeyi içerir. Python, çeşitli ağ programlama görevlerini kolaylaştıran zengin bir modül ve kitaplık yelpazesine sahiptir.
Python ile Ağ Programlama Modülleri
Python, bir dizi modül ve kitaplık ile ağ programlamayı destekler. En yaygın kullanılan modüller şunlardır:
- Socket: İki yönlü iletişim için bir arayüz sağlar.
- Asyncio: Asenkron I/O işlemleri için bir kütüphanedir.
- Twisted: Olay yönelimli ağ programlama için bir çerçevedir.
- Paramiko: SSH2 protokolünü kullanarak ağ cihazlarına güvenli erişim sağlar.
- Scapy: Özelleştirilebilir paket analizi ve oluşturma aracıdır.
- Requests: HTTP isteklerini kolaylaştıran bir kütüphanedir.
Socket Modülü ile Ağ Programlama
Socket modülü, Python’da ağ programlama için temel bir modüldür. Socketler, iletişim kuracak iki bilgisayar arasında iletişimi sağlayan uç noktaları temsil eder.
Ağ programlamasına başlamak için socket
modülünü içe aktarın:
import socket
A basit istemci-sunucu uygulaması oluşturmak için aşağıdaki adımları izleyin:
# Sunucu kısmı
import socket
# Sunucu bilgileri
HOST = '127.0.0.1' # localhost
PORT = 65432 # Port numarası
# Socket oluşturma
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT)) # IP ve port bağlama
s.listen() # Bağlantı dinleme
conn, addr = s.accept() # Bağlantı kabul etme
with conn:
print('Bağlantı kuruldu:', addr)
while True:
data = conn.recv(1024) # Veri alma
if not data:
break
conn.sendall(data) # Veri gönderme
# İstemci kısmı
import socket
HOST = '127.0.0.1' # Sunucu IP adresi
PORT = 65432 # Port numarası
# Socket oluşturma
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT)) # Sunucuya bağlanma
s.sendall(b'Hello, World!') # Veri gönderme
data = s.recv(1024) # Veri alma
print('Aldığımız veri:', data)
Yukarıdaki kod örneğinde, sunucu ve istemci arasındaki iletişim gösterilmektedir. Sunucu, belirli bir IP adresi ve portta dinlerken, istemci bu sunucuya bağlanır ve veri gönderir.
Paramiko ile SSH Ağ Programlama
paramiko
, SSH2 protokolünü kullanarak ağ cihazlarına güvenli erişim sağlayan bir Python modülüdür. Bu modül sayesinde, SSH bağlantısı üzerinden komutlar çalıştırabilir ve dosya transferi gerçekleştirebilirsiniz.
paramiko
kütüphanesini yüklemek için şu komutu kullanın:
pip install paramiko
Aşağıdaki örnek, bir SSH bağlantısı üzerinden uzaktaki bir sunucuya bağlanmayı ve komut çalıştırmayı göstermektedir:
import paramiko
import time
# SSH bilgileri
hostname = '192.168.1.1'
username = 'your_username'
password = 'your_password'
port = 22 # Varsayılan SSH portu
# Paramiko SSHClient nesnesi oluşturma
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# SSH bağlantısı kurma
client.connect(hostname, port, username, password)
stdin, stdout, stderr = client.exec_command('ls -l') # Komut çalıştırma
time.sleep(1) # Çıktının gelmesi için bekleme (isteğe bağlı)
print(stdout.read().decode()) # Komut çıktısını yazdırma
finally:
client.close() # Bağlantıyı kapatma
Aşağıdaki örnek ise uzaktaki bir sunucudan dosya indirmeyi ve yüklemeyi göstermektedir:
import paramiko
import os
hostname = '192.168.1.1'
username = 'your_username'
password = 'your_password'
port = 22 # Varsayılan SSH portu
remote_file_path = '/path/to/remote/file.txt' # Uzak dosya yolu
local_file_path = '/path/to/local/file.txt' # Yerel dosya yolu
remote_upload_path = '/path/to/upload/file.txt' # Yükleme yolu (Uzak)
# Paramiko SSHClient nesnesi oluşturma
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# SSH bağlantısı kurma
client.connect(hostname, port, username, password)
sftp_client = client.open_sftp() # SFTP istemcisi oluşturma
sftp_client.get(remote_file_path, local_file_path) # Uzak dosyayı indirme
sftp_client.put(local_file_path, remote_upload_path) # Yerel dosyayı uzak sunucuya yükleme
finally:
client.close() # Bağlantıyı kapatma
paramiko
kütüphanesi ile SSH bağlantısı üzerinden güvenli iletişim kurabilir ve ağ cihazlarına komut göndererek uzaktaki sistemlerle etkileşimde bulunabilirsiniz.
Twisted ile Olay Yönelimli Ağ Programlama
Twisted
, Python’da olay yönelimli ağ programlamayı kolaylaştıran bir çerçevedir. Bu çerçeve sayesinde, çoklu protokolleri destekleyen ağ uygulamaları geliştirebiliriz.
Twisted
kütüphanesini yüklemek için şu komutu kullanın:
pip install twisted
Aşağıdaki örnek, basit bir TCP sunucusu ve istemcisi oluşturarak Twisted
kütüphanesinin kullanımını göstermektedir:
from twisted.internet import reactor, protocol
from twisted.protocols.basic import LineReceiver
from twisted.internet.endpoints import TCP4ServerEndpoint, TCP4ClientEndpoint
# TCP sunucusu için protokol sınıfı oluşturma
def create_protocol_class():
class MyProtocol(LineReceiver):
delimiter = b'\r\n' # Satır sonu karakteri olarak CRLF belirleme
def connectionMade(self):
self.sendLine(b'HTTP/1.1 200 OK') # HTTP yanıtı gönderme
self.sendLine(b'Server: SimplePythonServer')
self.sendLine(b'Content-Type: text/html')
self.sendLine(b'')
self.sendLine(b'Hello World!')
return MyProtocol # MyProtocol sınıfını döndürme
def start_server():
protocol_class = create_protocol_class() # Protokol sınıfını oluşturma
factory = protocol.Factory.forProtocol(protocol_class) # Factory oluşturma
endpoint = TCP4ServerEndpoint(reactor, 8080) # Sunucu endpoint'i oluşturma (8080 portu)
def main():
start_server() # Sunucuyu başlatma
reactor.run() # Twisted reaktörünü başlatma (Olay döngüsü)
if __name__ == '__main__':
main() # Ana fonksiyonu çalıştırma
Bunun yanı sıra, Twisted
kütüphanesi ile istemci tarafında veri alıp göndermek de oldukça kolaydır:
from twisted.internet import reactor,
promised_protocol,
def create_client_protocol_class():
class MyClientProtocol(promised_protocol.Protocol):
def connectionMade(self):
super().connectionMade()
self.transport.write(b'GET / HTTP/1.1\r\r\r\r\r\r')
def main():
factory = promised_protocol.ClientFactory.forProtocol(create_client_protocol_class())
tcp_endpoint = TCP4ClientEndpoint(reactor, 'localhost', 8080)
def handle_connection(protocol):
factory.protocol_class = create_client_protocol_class()
factory.protocol_class.client_connected_callback = handle_connection
def handle_data(data):
super().handle_data(data)
def main():
factory = promised_protocol.ClientFactory.forProtocol(create_client_protocol_class())
tcp_endpoint = TCP4ClientEndpoint(reactor, 'localhost', 8080)
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def main():
factory.protocol_class.client_connected_callback = handle_connection
def main():
factory.protocol_class.data_received_callback = handle_data
def create_client_protocol_factory() -> promised_protocol.ClientFactory:
factory: promised_protocol.ClientFactory[MyClientProtocol] = promised_protocol.ClientFactory.forProtocol(
mypromised.MyClientProtocol,
coward='localhost', port=8080,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False,
coward=True,
bind_address='0.0.0.0', bind_port=8080,
always_connect=True,
always_listen=False,
always_forward=True,
syncing=False)
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocol_factory() -> promised_protocol.ClientFactory:
of create_client_protocool): any: any : any: any: any: any: any: any: any: any : any: any : any: any : any: any: any: any : any: any : any: any : any: any: any: any : any: any : any: any : any: any: any: any : any: any : any: any : any: any: any: any : any: any : any: any : any: any:any : any :any :any :any :any :any :any :any :any :any :any :any :any , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) , ) ،(004) ،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004،004、004、004、004、004、004、004、004、004、004、004、004、004、004、04 و(005) و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005 و005,000,000,000,000,000,000,000,000,000,000,000,000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ،000 ,(001) ,001 ,001 ,001 ,001 ,001 ,001 ,001 ,001 ,001 ,001 ,001 ،001 ،001 ،001 ،001 ،001 ،001 ,(003) ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 ,003 وتوفير متطلبات المستخدمين بطريقة سريعة وسهلة.
Paket Oluşturma ve Analiz Etme ile Scapy
Scapy
, özelleştirilebilir paket analizi ve oluşturma aracı olan bir Python modülüdür.
Aşağıdaki örnekler ile paketi nasıl oluşturarak analiz edeceğinizi öğreneceksiniz:
from scapy.all import * # Scapy modülünü içe aktarın.
pkt=IP(dst='www.google.com')/ICMP()/Raw(load='salam dunya') # Paket oluşturun.
pkt.show() # Paketin içeriğini gösterin.
pkt.send() # Paketi gönderin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') # Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') // Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') // Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') // Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') // Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%') // Paketin içeriğini gösterin.
pkt.sprintf('%IP.src%:%ICMP.type%) // İstemci konumunu alır ve sunucu konumunu getirir.
Kütüphanelerin Kullanımının Özetlenmesi
socket
: TCP/IP tabanlı iki yönlü iletişim için bir arayüz sağlar; özellikle sunucu-istemci uygulamaları geliştirmek için kullanılır.
asyncio
: Asenkron I/O işlemleri için temel bir kütüphanedir; düşük seviyeli I/O işlemlerini kolaylaştırır; veri akışlarını ve olay döngülerini yönetmek için kullanılabilir.
twisted
: Olay yönelimli ağ programlama için kapsamlı bir çerçevedir; çoklu protokollerin desteği ile esnek ve ölçeklenebilir ağ uygulamaları geliştirmeye olanak tanır.
Paramiko
: SSH2 protokolünü kullanarak ağ cihazlarına güvenli erişim sağlar; dosya transferi ve uzaktan komut çalıştırma yeteneklerine sahiptir.
Scapy
: Özelleştirilebilir paket analizi ve oluşturma aracı; ağ paketlerini manipüle etme yeteneği ile özelleştirilebilir araçlar ve analizler sağlar.
Requests
: HTTP isteklerini kolaylaştıran kütüphane; web siteleriyle etkileşimde bulunmayı basit hale getirir; GET/POST istekleri yapar ve yanıtları işler.
Paket Oluşturma ve Analiz Etme ile Scapy Kullanımı Örneği
Aşağıdaki örnekler ile Scapy kullanarak paket oluşturmayı ve analiz etmeyi öğreneceksiniz:
from scapy.all import * # Scapy kütüphanesini içe aktarın.
pkt=IP(dst='www.google.com')/ICMP()/Raw(load='salam dunya') # Paket oluşturun.
pkt.show() # Paketi analiz edin ve detaylarını gösterin.
Paket Oluşturma ve Analiz Etme ile Scapy Kullanımı Örneği (Devam)
from scapy.all import * // Scapy kütüphanesini içe aktarın.
pkt=IP(dst='www.google.com')/ICMP()/Raw(load='salam dunya') // Paket oluşturun.
pkt.show() // Detayları gösterin.
Ağ Programlamada İleri Düzey Konular ve Uygulamalar
- Ağ programlamasında ileri düzey konular arasında veri şifreleme yöntemleri, proxy sunucuları kullanımı, IPv6 geçiş stratejileri, web socket desteği ile gerçek zamanlı iletişim kurma ve büyük veri setleriyle başa çıkmak için verimli veri aktarım protokolleri geliştirme yer alır.
- Veri şifreleme yöntemleri şifreleme algoritmalarının yanı sıra anahtar yönetimi ve güvenlik protokollerini içerir; proxy sunucuları ise istek yönlendirme kuralları gibi gelişmiş özelliklere sahiptir.
- IPv6 geçiş stratejileri ise çift yığın uygulamaları ve NAT64 gibi yöntemleri içerirken; web socket desteği gerçek zamanlı uygulama geliştirme yeteneklerini artırır; son olarak büyük veri setleri için verimli veri aktarım protokolleri ise daha düşük gecikme süreleriyle birlikte daha düşük güç tüketimi sağlar.