مكتبه socket في بايثون
مكتبة socket في Python تمكّن المستخدمين من إنشاء تطبيقات الشبكات باستخدام بروتوكول TCP/IP أو UDP. يمكن استخدام مكتبة socket لإرسال واستقبال البيانات عبر الشبكة، وهي متوفرة كجزء من مكتبة Python القياسية.
لبدء استخدام مكتبة socket في Python، يمكن استيراد المكتبة باستخدام الأمر التالي:
import socket
لإنشاء اتصال TCP، يمكن استخدام الأمر socket.socket() لإنشاء كائن
socket، ثم استخدام الأمر connect() للاتصال بالخادم المحدد، كما يلي:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8080))
في هذا المثال، تم إنشاء كائن socket باستخدام AFINET (IPv4) و SOCKSTREAM (TCP). تم استخدام connect() للاتصال بالخادم المحلي المستضاف على المنفذ
8080.
بعد الاتصال بالخادم، يمكن إرسال البيانات باستخدام الأمر
sendall()، واستقبال البيانات باستخدام الأمر recv()، كما يلي:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8080)
# send data
message = 'Hello, server!'
sock.sendall(message.encode())
# receive response
response = sock.recv(1024).decode()
print(response)
# close socket
sock.close()
في هذا المثال، تم إرسال رسالة "Hello, server!" إلى الخادم، ثم
استقبال الاستجابة وطباعتها على الشاشة. أخيرًا، تم إغلاق الاتصال بالخادم
باستخدام الأمر close().
وظائف socket.socket
socket.socket هي فئة تمثل نقطة نهاية لتوصيل شبكي (end-point) في برمجة الشبكات باستخدام بروتوكول TCP/IP. يتم استخدامها لإنشاء مأخذ (socket) على الجانب المحلي من الاتصال وتمكين التواصل بين هذا المأخذ والمأخذ على الجانب الآخر من الاتصال.
تتكون فئة socket.socket من وظائف وخصائص، وهي:
الوظائف:
socket()
إنشاء مأخذ جديد.
bind(address)
ربط المأخذ بعنوان معين.
listen()
استماع بحثًا عن طلبات الاتصالات الواردة.
accept()
قبول اتصال وإرجاع عنوان العميل ومأخذ الاتصال.
connect(address)
إجراء اتصال بعنوان محدد.
send(data)
إرسال بيانات عبر المأخذ المفتوح.
recv(bufsize)
استقبال بيانات من المأخذ المفتوح.
الخصائص:
- - family : نوع العائلة للمأخذ.
- -type : نوع المأخذ (مثل SOCKSTREAM لاتصال TCP و SOCKDGRAM لاتصال UDP).
- - proto : نوع البروتوكول (مثل IPPROTOTCP لاتصال TCP و IPPROTOUDP لاتصال UDP).
- - timeout : وقت انتظار الاتصال قبل إرجاع خطأ.
bind
في تطبيقات الشبكات، يتم استخدام "bind" لربط عنوان IP ورقم المنفذ (port number) بمأخذ الاتصال (socket) الذي يتم إنشاؤه. يتم ذلك باستخدام دالة "bind()" المتاحة في مكتبة socket في بايثون.
على سبيل المثال، يمكن استخدام الكود التالي لربط مأخذ الاتصال بمنفذ 8000:
import socket
# إنشاء مأخذ الاتصال
serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ربط مأخذ الاتصال بعنوان IP ورقم المنفذ
serv_sock.bind(('127.0.0.1', 8000))
# الآن يمكن الاستماع على المنفذ المحدد
serv_sock.listen(1)
تم إنشاء مأخذ الاتصال باستخدام دالة socket()، ثم استخدمنا bind()
لربطه بعنوان IP ورقم المنفذ المحددين. يمكن بعد ذلك استخدام دالة listen()
للاستماع على المنفذ واستقبال الاتصالات الواردة.
accept
accept() هي دالة تستخدم في برمجة الشبكات في بايثون لاستقبال معلومات من عميل متصل بالخادم.
فيما يلي مثال على استخدام accept() في بايثون:
import socket
# إعداد الخادم
HOST = '127.0.0.1' # عنوان IP للخادم
PORT = 65432 # رقم المنفذ
# إنشاء كائن الخادم
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
# انتظار اتصال العميل
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
في هذا المثال، يتم إنشاء خادم TCP/IP يستخدم المنفذ 65432 وينتظر
اتصال العميل. عندما يتم الاتصال، يتم استخدام accept() لقبول الاتصال وإعادة
كائن conn وعنوان العميل addr . بعد ذلك، يمكن استخدام conn لإرسال واستقبال
البيانات بين الخادم والعميل.
socket.connect
socket.connect() هي وظيفة في لغة Python تستخدم لتأسيس اتصال TCP/IP بين جهاز الكمبيوتر الخاص بك وجهاز آخر عبر الإنترنت أو شبكة محلية.
فيما يلي مثال على كيفية استخدام socket.connect() :
import socket
HOST = 'www.example.com' # اسم المضيف
PORT = 80 # رقم المنفذ
# إنشاء كائن socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# الاتصال بالخادم المضيف
s.connect((HOST, PORT))
print('Connected to', HOST)
في هذا المثال، يتم إنشاء كائن socket باستخدام socket.socket() ، ثم
يتم استخدام s.connect() لتأسيس اتصال TCP/IP بين جهاز الكمبيوتر الخاص بك
والخادم المضيف (www.example.com) على المنفذ 80.
socket send
وظيفة send() في مكتبة socket في بايثون تستخدم لإرسال بيانات عبر اتصال TCP/IP أو UDP. يمكن استخدام هذه الوظيفة لإرسال البيانات من العميل إلى الخادم أو بالعكس.
لإستخدام هذه الوظيفة، يجب استيراد المكتبة socket وإنشاء كائن socket ثم
استخدام الوظيفة send() في هذا الكائن.
المثال التالي يوضح كيفية
استخدام send() لإرسال بيانات عبر اتصال TCP/IP:
import socket
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the server address
server_address = ('localhost', 10000)
print('connecting to %s port %s' % server_address)
sock.connect(server_address)
# Send data
message = 'Hello, server!'
sock.sendall(message.encode())
# Receive response
data = sock.recv(1024)
print('received "%s"' % data.decode())
# Close the socket
sock.close()
في المثال أعلاه، يتم إنشاء كائن socket باستخدام العنوان (AFINET) ونوع الاتصال (SOCKSTREAM). ثم يتم الاتصال بالخادم باستخدام العنوان ورقم المنفذ. يتم إرسال
البيانات باستخدام الوظيفة send() ، ثم يتم استلام الرد بواسطة recv() . أخيرًا،
يتم إغلاق الاتصال بواسطة close() .
socket recv
دالة recv في بايثون تستخدم لاستقبال البيانات عبر اتصال TCP/IP. إليك بعض المعلومات عنها:
تأخذ دالة recv معاملين:
- - buffer_size : حجم البيانات التي تريد استقبالها.
- - flags : أسلوب الاستقبال وهو عادةً 0.
تقوم recv بعملية الاستقبال وإرجاع البيانات المستقبلة كـ bytes . يمكنك
تحديد الحد الأقصى لحجم البيانات المستقبلة باستخدام buffer_size .
فيما يلي مثال بسيط يستخدم دالة recv لاستقبال البيانات:
import socket
# إعداد اتصال TCP/IP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("example.com", 80))
# استقبال البيانات (الحد الأقصى: 4096 بايت)
data = s.recv(4096)
# إغلاق الاتصال
s.close()
في هذا المثال، يتم إنشاء اتصال TCP/IP بـ example.com على المنفذ
80، ثم يتم استقبال البيانات من الخادم باستخدام recv وحفظها في متغير data..
أخيرًا، يتم إغلاق الاتصال.
دوال مكتبة socket
تُستخدم مكتبة socket.في لغة بايثون لإنشاء تطبيقات الشبكات والاتصال بين البرامج عبر الشبكة. وفيما يلي بعض الدوال الهامة التي توفرها هذه المكتبة:
socket()
يتم استخدام هذه الدالة لإنشاء كائن socket. تأخذ نوع البروتوكول المطلوب كمدخل، مثل AF_INET أو AF_UNIX .
bind()
تستخدم لربط كائن socket بعنوان IP ورقم منفذ port.
listen()
يستخدم للاستماع إلى طلبات الاتصال الواردة على كائن socket.
accept()
تستخدم لقبول الاتصالات الواردة وإنشاء قناة اتصال جديدة.
connect()
يستخدم للاتصال بخادم معين وفتح قناة اتصال.
send()
يستخدم لإرسال البيانات عبر قناة الاتصال.
recv()
يستخدم لاستلام البيانات عبر قناة الاتصال.
close()
يستخدم لإغلاق الكائن socket وإنهاء الاتصال.
هذه بعض الدوال الأساسية
التي توفرها مكتبة socket في بايثون، ويمكن استخدامها للعمل على إنشاء تطبيقات
الشبكات المختلفة.
مثال برنامج بستخدام socket python
هذا مثال بسيط لبرنامج يستخدم sockets في Python لإنشاء اتصال بسيط بين عميل وخادم:
server.py:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen()
print('Waiting for a client to connect...')
while True:
(client_socket, client_address) = server_socket.accept()
print(f'Client connected: {client_address}')
client_socket.send(b'Successfully connected to server!\n')
client_socket.close()
client.py:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8000))
data = client_socket.recv(1024)
print(data.decode())
client_socket.close()
هذا المثال يبدأ بإنشاء socket على الخادم باستخدام العنوان AFINET ونوع SOCKSTREAM. ثم يربط الخادم بالعنوان localhost والمنفذ 8000 ، ويستمع إلى اتصالات
المستخدمين.
يتم تكرار دورة الاستماع والاستقبال في حلقة while بحيث
يتم قبول اتصالات المستخدمين الجدد وإرسال رسالة نجاح بمجرد الاتصال. ثم يتم
إغلاق الاتصال بعد الانتهاء من الإرسال.
على الجانب الآخر ، يتم إنشاء
اتصال عميل باستخدام نفس العنوان والمنفذ. تم استلام رسالة من الخادم وطباعتها ثم
تم إغلاق الاتصال.