Merhaba, ben Bunjo, bu sefer "Ruby" dışında "Python" ile "socket"
kütüphanesini çalışacağız - daha sonra Ruby için de bu anlatımı yapacağım -
uzatmadan konuya girişimizi yapalım.
Nedir Bu Socket Kavramı?
Socket, bilgisayar ağlarında ve iletişim protokollerinde kullanılan bir kavramdır. Programlamada ise genellikle "socket" kelimesi, ağ üzerinden veri iletimi için kullanılan bir arayüzü ifade eder. Socket programlaması, bilgisayarlar arasında veri iletimi sağlamak için kullanılan bir API (Application Programming Interface) setini içerir.
Socket programlaması genellikle iki türde gerçekleşir: TCP (Transmission Control Protocol) ve UDP (User Datagram Protocol).
TCP (Transmission Control Protocol): Güvenilir, bağlantı odaklı bir iletişim protokolüdür.
Veri paketleri, gönderici ve alıcı arasında güvenli bir bağlantı kurularak iletilir.
TCP, veri paketlerinin sırasını korur ve paket kaybını önlemek için tekrar iletim sağlar.
UDP (User Datagram Protocol): Bağlantısız, güvenilirlik garantisi olmayan bir iletişim protokolüdür.
Veri paketleri, alıcıya doğrudan gönderilir, ancak paket kaybı veya sıralama garantisi yoktur.
UDP, özellikle hızlı veri iletimi gerektiren durumlarda tercih edilir.
Arasındaki farkı daha rahat anlamanız için:
Biraz da espriye kaçalım
Socket Programlaması İçerdiği Adımlar
Socket Oluşturma: İki taraftaki iletişim için birer socket oluşturulur.
Bağlantı Kurma (Opsiyonel): TCP tabanlı bir iletişimde, bağlantı kurma adımı gerçekleştirilebilir.
Veri Gönderme ve Alım: Oluşturulan socket aracılığıyla veri gönderme ve alma işlemleri gerçekleştirilir.
Bağlantı Sonlandırma (Opsiyonel): İletişim tamamlandığında, bağlantı kapatılabilir.
Genel olarak görsel yardımları ile de "socket" kavramını anladığımıza göre şimdi işin uygulama kısmına geçelim;
Python Socket Programlama
Python'da socket kütüphanesi, ağ programlaması için kullanılan bir modüldür. Bu modül, bilgisayarlar arasında veri iletimi ve iletişimi sağlamak için kullanılır.
Socket programlaması genellikle TCP/IP protokolünü temel alır ve bir bilgisayarın belirli bir IP adresi ve port numarası üzerinden başka bir bilgisayarla iletişim kurmasına olanak tanır.
Socket Türleri:
socket.AF_INET: IPv4 adres türü.
socket.AF_INET6: IPv6 adres türü.
socket.SOCK_STREAM: TCP bağlantıları için.
socket.SOCK_DGRAM: UDP bağlantıları için.
Diğer türler: socket.SOCK_RAW, socket.SOCK_RDM, socket.SOCK_SEQPACKET, vb.
Metodlar:
socket.bind(address): Bir adresi sokete bağlar.
socket.listen(backlog): Bağlantıları bekler ve kuyruğa ekler.
socket.accept(): Bağlantıyı kabul eder.
socket.connect(address): Bir adrese bağlanır.
socket.send(data): Veriyi gönderir.
socket.recv(bufsize): Belirtilen miktarda veri alır.
socket.close(): Soketi kapatır.
Diğer Özellikler:
socket.setsockopt(level, optname, value): Soket seçeneklerini ayarlar.
socket.getsockopt(level, optname[, buflen]): Soket seçeneklerini alır.
socket.settimeout(timeout): Soket zaman aşımını belirler.
socket.gettimeout(): Soket zaman aşımını alır.
socket.setblocking(flag): Bloklayıcı modu ayarlar.
socket.makefile(mode[, buffering]): Bir soket nesnesini dosya benzeri bir nesneye dönüştürür.
IPv6 Desteği:
IPv6 adres türü (socket.AF_INET6) ile IPv6 ağlarına bağlanma ve hizmet verme.
Broadcast ve Multicast Desteği:
Broadcast iletişim için kullanılabilir.
Multicast gruplarına katılma ve onlardan ayrılma.
Secured Socket Layer (SSL) Desteği:
ssl modülü ile birlikte kullanarak şifreli iletişim sağlar.
Asenkron İşlemler:
asyncio kütüphanesi ile birlikte kullanılarak asenkron (non-blocking) soket işlemleri yapabilirsiniz.
Raw Soketler:
socket.SOCK_RAW kullanarak ağ katmanında direkt kontrol sağlayabilirsiniz.
Temel İşlemler
Server (Sunucu) Oluşturma:
Sunucu oluşturmak için bir soket (socket) nesnesi yaratılır ve bir IP adresi ve port numarası atanır. Ardından bind ve listen metodları kullanılarak bağlantıları dinlemeye başlar.
Not: her kodda "import" ile "socket" kütüphanesini "import socket" ile içeriye aktarmanız gerekecektir.
Python:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 12345)
server_socket.bind(server_address)
server_socket.listen(5) # En fazla 5 bekleyen bağlantıyı kabul et
print("Server listening on {}:{}".format(*server_address))
Client (İstemci) Bağlantısı:
İstemci, sunucuyla bağlantı kurmak için connect metodunu kullanır.
İstemci, sunucuyla bağlantı kurmak için connect metodunu kullanır.
Python:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 12345)
client_socket.connect(server_address)
Veri Gönderme ve Alımı:
"send" ve "recv" metodları kullanılarak veri gönderilebilir ve alınabilir.
Python:
# Sunucu tarafında
connection, client_address = server_socket.accept()
data = connection.recv(1024) # 1024 byte'lık veri al
# İstemci tarafında
client_socket.send(b"Hello, server! How are you?")
Bağlantı Kapatma:
close metodunu kullanarak bağlantıları kapatabilirsiniz.
close metodunu kullanarak bağlantıları kapatabilirsiniz.
Python:
# Sunucu ve istemci tarafında
connection.close()
server_socket.close()
client_socket.close()
Socket Serveri:
Python:
import socket
import threading
# Sunucu ayarları
SERVER_HOST = 'localhost'
SERVER_PORT = 12345
def handle_client(client_socket):
try:
# İstemciden gelen veriyi al
data = client_socket.recv(1024)
print("Received from {}: {}".format(client_socket.getpeername(), data.decode()))
# İstemciye hoşgeldin mesajını gönder
welcome_message = "Welcome to the server!"
client_socket.send(welcome_message.encode())
finally:
# Bağlantıyı kapat
client_socket.close()
def start_server():
# IPv4 ve TCP kullanarak bir soket oluştur
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Soketi belirtilen IP ve port numarasına bağla
server_socket.bind((SERVER_HOST, SERVER_PORT))
# Bağlantıları dinlemeye başla
server_socket.listen(5)
print("Server listening on {}:{}".format(SERVER_HOST, SERVER_PORT))
while True:
# Bağlantıyı kabul et
client_socket, client_address = server_socket.accept()
print("Accepted connection from {}:{}".format(*client_address))
# İstemci için yeni bir iş parçacığı oluştur
client_handler = threading.Thread(target=handle_client, args=(client_socket,))
client_handler.start()
except KeyboardInterrupt:
print("Server shutting down.")
finally:
# Soketi kapat
server_socket.close()
if __name__ == "__main__":
start_server()
Socket İstemcisi:
Python:
import socket
# Sunucu ayarları
SERVER_HOST = 'localhost'
SERVER_PORT = 12345
# İstemci soketi oluştur
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Sunucuya bağlan
client_socket.connect((SERVER_HOST, SERVER_PORT))
# Sunucudan hoşgeldin mesajını al
welcome_message = client_socket.recv(1024)
print("Received from server: {}".format(welcome_message.decode()))
# İstemci olarak sunucuya bir mesaj gönder
message_to_send = "Hello, server! I'm the client."
client_socket.send(message_to_send.encode())
finally:
# İstemci soketini kapat
client_socket.close()
Python gibi birçok programlama dilinde socket programlaması için hazır kütüphaneler bulunmaktadır.
Örneğin, Python'da socket modülü, bu tür iletişim işlemlerini gerçekleştirmek için kullanılır fakat alternatif kütüphaneler ve örnek kodlara da
bakmak isterseniz onlardan da bahsedeyim.
Twisted
Twisted, asenkron ağ programlaması için kapsamlı bir kütüphanedir.
TCP, UDP, SSL gibi protokollerle çalışabilir.
Hem server hem de client uygulamaları oluşturmak için kullanılabilir.
Python:
from twisted.internet import reactor, protocol
class MyProtocol(protocol.Protocol):
def connectionMade(self):
self.transport.write(b"Merhaba, dünya!")
class MyFactory(protocol.Factory):
def buildProtocol(self, addr):
return MyProtocol()
reactor.listenTCP(12345, MyFactory())
reactor.run()
Tornado
Tornado, web uygulamaları için geliştirilmiş bir framework olmasına rağmen,
aynı zamanda asenkron ağ programlaması için kullanılabilir. WebSocket desteği bulunur.
Tornado genellikle web uygulamalarında kullanılsa da, genel ağ programlama ihtiyaçları için de kullanılabilir.
Python:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Merhaba, dünya!")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(12345)
tornado.ioloop.IOLoop.current().start()
ZeroMQ, hafif ve yüksek performanslı bir mesajlaşma kütüphanesidir.
Çoklu dil desteği sunar ve birçok farklı iletişim modelini destekler.
Sisteminizde ZeroMQ yüklü değilse, önce pip install pyzmq ile kütüphaneyi yükleyebilirsiniz.
Python:
import zmq
context = zmq.Context()
# PUB-SUB örneği
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://127.0.0.1:12345")
# Veri gönderme
publisher.send(b"Merhaba, dünya!")
Uzun bir vaktimi aldı hazırlamak bunun karşılığında konuyu beğenmeyi ve
güzel bir mesaj atmayı unutmayalım
okuyan herekese teşekkürlerimi sunuyourum
sorulara açığım ve gözümden kaçan bir şey olduysa söyleyebilirsiniz
bu günlük de benden bu kadar olsun
güzel bir mesaj atmayı unutmayalım
okuyan herekese teşekkürlerimi sunuyourum
sorulara açığım ve gözümden kaçan bir şey olduysa söyleyebilirsiniz
bu günlük de benden bu kadar olsun
Son düzenleme: