برمجة الشبكات باستخدام Sockets في بايثون

Amine
15/09/2024

المقابس (Sockets) هي نقاط النهاية للاتصال ثنائي الاتجاه بين برنامجين يعملان على الشبكة. توفر وحدة socket في بايثون طريقة لاستخدام المقابس لتنفيذ الاتصال عبر الشبكة.

إنشاء خادم TCP بسيط

يستمع خادم TCP للاتصالات الواردة ويمكنه التعامل مع عدة عملاء. إليك كيفية إنشاء خادم TCP بسيط:

import socket

def start_server():
    # إنشاء كائن مقبس
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # الربط بعنوان محلي ورقم منفذ
    server_socket.bind(('localhost', 12345))
    
    # الاستماع للاتصالات الواردة
    server_socket.listen(5)
    print("Server is listening on port 12345...")

    while True:
        # قبول اتصال من عميل
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        
        # إرسال رسالة إلى العميل
        client_socket.send(b"Hello from server!")
        
        # استقبال بيانات من العميل
        data = client_socket.recv(1024)
        print(f"Received: {data.decode()}")
        
        # إغلاق اتصال العميل
        client_socket.close()

# بدء تشغيل الخادم
start_server()

socket.socket(): ينشئ مقبس جديد.

bind(): يربط المقبس بعنوان محلي ورقم منفذ.

listen(): يتيح للخادم قبول الاتصالات.

accept(): ينتظر اتصال وارد ويعيد كائن مقبس جديد للعميل.

recv(): يستقبل بيانات من العميل.

إنشاء عميل TCP بسيط

يتصل عميل TCP بخادم ويتبادل البيانات. إليك كيفية إنشاء عميل TCP بسيط:

import socket

def start_client():
    # إنشاء كائن مقبس
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # الاتصال بالخادم
    client_socket.connect(('localhost', 12345))
    
    # استقبال رسالة من الخادم
    message = client_socket.recv(1024)
    print(f"Received from server: {message.decode()}")
    
    # إرسال بيانات إلى الخادم
    client_socket.send(b"Hello from client!")
    
    # إغلاق الاتصال
    client_socket.close()

# بدء تشغيل العميل
start_client()

connect(): يتصل المقبس بعنوان ورقم منفذ الخادم.

send(): يرسل بيانات إلى الخادم.

recv(): يستقبل بيانات من الخادم.

التمارين

التمرين 1: عدل خادم TCP ليتمكن من التعامل مع عدة عملاء عن طريق الرد بوقت الخادم الحالي لكل عميل.

import socket
import time

def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    print("Server is listening on port 12345...")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        
        # إرسال الوقت الحالي للخادم إلى العميل
        current_time = time.ctime(time.time())
        client_socket.send(current_time.encode())
        
        client_socket.close()

start_server()

التمرين 2: أنشئ عميل TCP يتصل بالخادم المعدل من التمرين 1، يستقبل الوقت الحالي للخادم، ويطبعه.

import socket

def start_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))
    
    # استقبال الوقت الحالي للخادم
    server_time = client_socket.recv(1024)
    print(f"Server time: {server_time.decode()}")
    
    client_socket.close()

start_client()

التمرين 3: عدل خادم TCP ليعيد أي رسالة يستقبلها من العميل، مع إضافة “Echo: ” قبل الرسالة.

import socket

def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    print("Server is listening on port 12345...")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        
        # استقبال بيانات من العميل
        data = client_socket.recv(1024)
        print(f"Received: {data.decode()}")
        
        # إعادة البيانات إلى العميل
        response = f"Echo: {data.decode()}"
        client_socket.send(response.encode())
        
        client_socket.close()

start_server()

عمل ممتاز! لقد تعلمت كيفية استخدام وحدة socket لإنشاء خوادم وعملاء TCP بسيطين، مما يتيح الاتصال عبر الشبكة في تطبيقاتك.

التعليقات

اترك تعليقاً