Python ile Socket Programlama 1

Merhabalar, Son zamanlar da socket üzerine çalışmalar yaptım ve bu çalışmaları yaparken fark ettim ki socket üzerine çok az kaynak var.(İngilizce) Socket yönetimi nasıl olur sorusunu sır gibi saklıyorlar sanırım.

Python ile Socket Programlama yazılarım da yazdığım örnek kodları ve socket mantinini açıklamaya çalışacağım.

Öncelikle Socket ile ilgili örneklere bakarsanız hepsinin thread ile yapıldığını göreceksiniz peki bu iyi bir örnek (Best Practice) mi? Bence best practice I/O(input/output giriş/çıkış) işlemlerini AsyncIO ile yapmaktır. Eğer best practice AsyncIO değil diyorsanız bana ulaşıp açıklayın birlikte tartışıp öğrenelim.

Socket Nedir ?

İngilizce de bir çok şeye socket denir. Bizim için ise bilgisayarımızda ki portlara verdiğimiz ad.

Socket Programlama Nedir ?

Kısaca bilgisayar portları aracılığıyla bilgi alıp, bilgi gönderme işlemine denir. IP ve port ikilisi ile bağlandığımız kanal aracılığıyla bilgi gönderip, alabiliyoruz.

Socket programlama

Thread ile basit Socket Uygulaması

ilk olarak server.py dosyamızı yazalım. Server dosyamız thread sayesinde birden fazla isteği karşılayabiliyor

#server.py
import socket
import threading

HEADER = 64
IP = socket.gethostbyname(socket.gethostname())
PORT = 9999
ADDR = (IP, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "DISCONNECT_SERVER_CODE"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)


def handle_client(conn, addr):
    print("[New Connection] {addr} connected...")

    connected = True
    while connected:
        max_lenth = conn.recv(HEADER).decode(FORMAT)
        if max_lenth:
            max_lenth = int(max_lenth)
            msg = conn.recv(max_lenth).decode(FORMAT)
            write_active_connections()
            if msg == DISCONNECT_MESSAGE:
                print("[Disconnect] Disconnecting from server")
                connected = False

            print(f"[{addr}] -> {msg}")
            # Do whatever you want with message

    conn.close()
    write_active_connections()


def write_active_connections():
    print(f"Active Connection Count is {threading.activeCount()}")


def start():
    server.listen()
    print(f"[Listening] Server is Listening now on {IP}")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        write_active_connections()


if __name__ == "__main__":
    print("[Starting] Socket Server is starting... Stand By")
    start()

Server.py dosyamızı incelersek thread ile gelen istekleri kontrol edecek handle_client fonksiyonu calistirilmis. Thread kullanıldığı için birden fazla istek ayni anda islenebiliyor.

handle_client fonksiyonu içerisinde aşağıdaki satir ile kullanıcıdan gelen mesajın uzunluğunun bilgisi alınıyor(max_length). Socket mesaj uzunluğu kadar dinlenip asil mesaj alınıyor(msg).

max_lenth = conn.recv(HEADER).decode(FORMAT)
...
msg = conn.recv(max_lenth).decode(FORMAT)

Diğer kod satırları anlaşılır duruyor eğer anlamadığınız bir nokta olursa iletişim kurmaktan kaçınmayın 🙂

Client.py dosyamız

#client.py
import socket

HEADER = 64
PORT = 9999
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "DISCONNECT_SERVER_CODE"
IP = socket.gethostbyname(socket.gethostname())
ADDR = (IP, PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)


def send(msg):
    message = msg.encode(FORMAT)
    msg_lenth = str(len(message)).encode(FORMAT)
    header = msg_lenth + b' ' * (HEADER - len(msg_lenth))
    client.send(header)
    client.send(message)


send("Hello World 1")
send("Hello MESSAGE 2")
send("Hello MESSAGE 3")
send("Hello MESSAGE 4")
send(DISCONNECT_MESSAGE)

Client.py dosyasında mesaj gönder (send) fonksiyonunda mesajı göndermeden önce mesajın uzunluğunu gönderiyoruz ki server ne kadar bilgiyi socket’den çekmesi gerektiğini bilsin.

Kaynak Kod:

Kod Örneği Github FurkanOzkaya

One Comment

Add a Comment

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir