المقدمة

تخيل إنك في مطعم:

  • إنت = العميل (Client)
  • المطعم = السيرفر (Server)
  • الطلب = Request
  • الأكل اللي بيجيلك = Response

إنت بتطلب (Request)، والمطعم بيرد عليك بالأكل (Response). ده بالظبط نموذج Client-Server.


يعني إيه Client-Server Model؟

التعريف

نموذج معماري بيقسم المهام بين طرفين:

  • Client (العميل): اللي بيطلب الخدمة
  • Server (الخادم): اللي بيقدم الخدمة

المبدأ الأساسي

Client  ──────[Request]──────→  Server
        ←─────[Response]──────

العميل دايماً هو اللي يبدأ الاتصال، والسيرفر ينتظر ويرد.


مكونات النموذج

1. Client (العميل)

التعريف

أي تطبيق أو جهاز بيطلب خدمة من سيرفر.

أمثلة على Clients

✓ المتصفح (Chrome, Firefox)
✓ تطبيق الموبايل (WhatsApp, Instagram)
✓ برنامج البريد (Outlook, Gmail App)
✓ لعبة Online
✓ سطر الأوامر (curl, wget)

وظائف الـ Client

1. إرسال Requests
2. استقبال Responses
3. عرض البيانات للمستخدم
4. التعامل مع الأخطاء

مثال بسيط - Client في Python

import requests

# Client بيطلب صفحة من Server
response = requests.get('https://example.com')

print(f"Status Code: {response.status_code}")
print(f"Content: {response.text[:100]}")

2. Server (الخادم)

التعريف

برنامج أو جهاز بيستنى Requests ويرد عليها.

أمثلة على Servers

✓ Web Server (Apache, Nginx)
✓ Database Server (MySQL, PostgreSQL)
✓ Mail Server (Postfix, Exchange)
✓ File Server (FTP, Samba)
✓ Game Server
✓ API Server

وظائف الـ Server

1. الاستماع (Listening) على منفذ معين
2. استقبال Requests
3. معالجة الطلبات
4. إرسال Responses
5. إدارة الموارد
6. التعامل مع عدة Clients في نفس الوقت

مثال بسيط - Server في Python

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # السيرفر بيرد على أي Request
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'Hello from Server!')

# السيرفر يستنى على المنفذ 8080
server = HTTPServer(('localhost', 8080), SimpleHandler)
print("Server listening on port 8080...")
server.serve_forever()

جربه:

# شغل السيرفر
python server.py

# في Terminal تاني، اعمل Request
curl http://localhost:8080

# النتيجة:
Hello from Server!

دورة حياة Request-Response

الخطوات الكاملة

1. Client يفتح اتصال مع Server
2. Client يرسل Request
3. Server يستقبل Request
4. Server يعالج الطلب
5. Server يرسل Response
6. Client يستقبل Response
7. Client يعرض البيانات
8. الاتصال يتقفل (أو يفضل مفتوح)

مثال عملي - فتح موقع

السيناريو: إنت بتفتح https://example.com

┌───────────────────────────────────┐
│ Step 1: DNS Lookup                      
│ Client: "فين example.com?"               
│ DNS: "ده 93.184.216.34"                  
└───────────────────────────────────┘
┌────────────────────────────────────┐
│ Step 2: TCP Connection (3-Way Handshake)  
│ Client → Server: SYN                     
│ Server → Client: SYN-ACK                 
│ Client → Server: ACK                     
└────────────────────────────────────┘
┌────────────────────────────────────┐
│ Step 3: TLS Handshake (للـ HTTPS)           
│ Client: "عايز اتصال مشفر"                     
│ Server: "تبادل المفاتيح والشهادات                 
└────────────────────────────────────┘
┌────────────────────────────────────┐
  Step 4: HTTP Request                      
   Client → Server:                         
    GET / HTTP/1.1                          
    Host: example.com                       
    User-Agent: Mozilla/5.0                 
    Accept: text/html                       
└────────────────────────────────────┘
┌────────────────────────────────────┐
  Step 5: Server Processing                               
│ -x السيرفر يقرأ الطلب                                  
│ -x يجهز الصفحة المطلوبة                                
│ -x يشغل PHP/Python إذا لازم                            
│ -x يجيب بيانات من Database لو محتاج                   
└────────────────────────────────────┘
┌────────────────────────────────────┐
│ Step 6: HTTP Response                                   
│ Server → Client:                                        
│   HTTP/1.1 200 OK                                       
│   Content-Type: text/html                               
│   Content-Length: 1234                                  
│   <!DOCTYPE html>                                       
│   <html>                                                
│   ...                                                   
└────────────────────────────────────┘
┌────────────────────────────────────┐
│ Step 7: Client Rendering                                
│ -x المتصفح يستلم HTML                                   
│ -x يطلب CSS, JS, Images                                 
│ -x يرسم الصفحة                                        
│ -x الصفحة تظهر لك                                       
└────────────────────────────────────┘

أنواع Client-Server Architectures

1. Two-Tier (طبقتين)

Client يتكلم مع Server مباشرة.

┌───────┐         ┌─────────┐
│ Client    ← →      Database  
│ (App)                Server    
└───────┘         └─────────┘

مثال: برنامج محاسبة Desktop يتصل بـ Database مباشرة.

المشاكل:

  • صعب التحديث (لازم تحدث كل Client)
  • أمان أقل (كل Client متصل بالـ Database)

2. Three-Tier (ثلاث طبقات)

في طبقة وسيطة (Application Server).

┌─────────┐     ┌─────────────┐     ┌──────────┐
│ Client      ←→   Application     ←→    Database    
│(Browser)            Server                 Server    
└─────────┘     └─────────────┘     └──────────┘

مثال: موقع ويب.

  • Client: المتصفح
  • Application Server: PHP/Python يشغل الكود
  • Database: MySQL يخزن البيانات

المميزات:

  • سهل التحديث (مرة واحدة على السيرفر)
  • أمان أفضل (Clients مش متصلين بالـ Database مباشرة)
  • Scalability أفضل

3. N-Tier (متعدد الطبقات)

طبقات أكتر للتعقيد الكبير.

┌─────────┐   ┌──────┐   ┌────────┐   ┌──────┐   ┌──────┐
│ Client     ←→  Load   ←→   App     ←→  Cache  ←→    DB    
│                Balancer      Server        Server       Server 
└─────────┘   └──────┘   └────────┘   └──────┘   └──────┘

مثال: موقع كبير زي Facebook.


بروتوكولات Client-Server

1. HTTP/HTTPS (Web)

Client Request:
GET /index.html HTTP/1.1
Host: example.com

Server Response:
HTTP/1.1 200 OK
Content-Type: text/html

<html>...</html>

2. FTP (File Transfer)

Client → Server: "USER admin"
Server → Client: "331 Password required"
Client → Server: "PASS 12345"
Server → Client: "230 Login successful"
Client → Server: "RETR file.txt"
Server → Client: [file content]

3. SMTP (Email Sending)

Client → Server: "HELO client.com"
Server → Client: "250 Hello"
Client → Server: "MAIL FROM: <user@client.com>"
Client → Server: "RCPT TO: <user@server.com>"
Client → Server: "DATA"
Client → Server: [email content]
Client → Server: "."
Server → Client: "250 Message accepted"

4. DNS (Domain Name System)

Client → DNS Server: "What's google.com?"
DNS Server → Client: "It's 142.250.185.46"

5. SSH (Secure Shell)

Client → Server: [connection request]
Server → Client: [public key]
Client → Server: [encrypted authentication]
Server → Client: "Welcome to server!"

مثال عملي كامل

السيناريو: نظام تسجيل دخول بسيط

Server (Flask - Python)

from flask import Flask, request, jsonify

app = Flask(__name__)

# Database مزيفة
users = {
    'admin': 'password123',
    'user1': 'mypass'
}

@app.route('/login', methods=['POST'])
def login():
    # السيرفر يستقبل Request
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    
    # السيرفر يعالج الطلب
    if username in users and users[username] == password:
        # Success Response
        return jsonify({
            'status': 'success',
            'message': 'Login successful',
            'token': 'abc123xyz789'
        }), 200
    else:
        # Error Response
        return jsonify({
            'status': 'error',
            'message': 'Invalid credentials'
        }), 401

# السيرفر يستنى على المنفذ 5000
if __name__ == '__main__':
    app.run(port=5000)

Client (Python)

import requests
import json

# Client يرسل Request
url = 'http://localhost:5000/login'
data = {
    'username': 'admin',
    'password': 'password123'
}

response = requests.post(url, json=data)

# Client يعالج Response
if response.status_code == 200:
    result = response.json()
    print(f"✓ {result['message']}")
    print(f"Token: {result['token']}")
else:
    result = response.json()
    print(f"✗ {result['message']}")

تشغيل المثال

# Terminal 1: شغل السيرفر
python server.py
# Server listening on port 5000...

# Terminal 2: شغل الـ Client
python client.py
# ✓ Login successful
# Token: abc123xyz789

اللي بيحصل كالآتي

1. Client يفتح TCP connection على localhost:5000
2. Client يرسل HTTP POST request:
   POST /login HTTP/1.1
   Content-Type: application/json
   
   {"username": "admin", "password": "password123"}

3. Server يستقبل Request
4. Server يفحص Username & Password
5. Server يرد بـ Response:
   HTTP/1.1 200 OK
   Content-Type: application/json
   
   {"status": "success", "message": "Login successful", ...}

6. Client يستقبل Response ويطبعها

خلاصة

نموذج Client-Server ببساطة

Client: "عايز حاجة"
Server: "اتفضل"

الأساسيات

  • Client: اللي بيطلب (Browser, App, CLI)
  • Server: اللي بيرد (Web Server, API, Database)
  • Request: الطلب من Client
  • Response: الرد من Server

الأنواع

Two-Tier:   Client ←→ Server
Three-Tier: Client ←→ App Server ←→ Database
N-Tier:     طبقات متعددة للتعقيد الكبير

البروتوكولات الشائعة

  • HTTP/HTTPS: المواقع
  • FTP: نقل الملفات
  • SMTP/POP3/IMAP: البريد الإلكتروني
  • DNS: ترجمة الأسماء
  • SSH: الدخول الآمن