مقدمه‌ای بر برنامه‌نویسی شبکه در پایتون

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 29 خرداد 1397
دسته بندی ها : پایتون

در این آموزش قصد آشنا کردن شما با سوکت‌ها در زبان برنامه‌نویسی پایتون و چگونگی استفاده از ماژول‌ سوکت برای ایجاد سرورها و کلاینت‌های HTTP را دارم. همچنین Tornado را پوشش می‌دهیم، این مورد یک کتابخانه شبکه پایتون است که برای اپلیکیشن‌هایی با قابلیت ارتباط طولانی مدت با هر کاربر ایجاد شده است. 

سوکت‌ها چه هستند؟

یک سوکت، لینکی است میان دو اپلیکیشن که می‌توانند با همدیگر ارتباط برقرار کنند. این حالت می‌تواند به صورت محلی روی یک ماشین و یا به صورت ریموت بین دو ماشین جداگانه انجام شود.

به صورت کلی سوکت‌ها مانند یک لینک بین دو موجودیت کار می‌کنند -برای مثال بین مشتری و سرور-. یک سرور اطلاعات درخواست شده توسط مشتری را برگشت می‌دهد. برای مثال وقتی شما وارد یک صفحه وب می‌شوید مرورگر یک سوکت ایجاد کرده و آن را به سرور متصل می‌کند.

ماژول سوکت

برای ایجاد یک سوکت شما می‌توانید از تابع socket.socket() استفاده کنید، سینتکس این حالت به صورت زیر است:

import socket
s= socket.socket (socket_family, socket_type, protocol=0)

در اینجا می‌توانید توضیحاتی در ارتباط با آرگومان را مطالعه کنید:

  • socket_family : آدرس و پروتکل اعضا را نشان می‌دهد. این مورد می‌تواند AF_UNIX و یا  AF_INET باشد.
  • socket_type : نوع سوکت را نمایش می‌دهد که می‌تواند SOCK_STREAM يا SOCK_DGRAM باشد.
  • protocol : این مورد یک آرگومان اختیاری است و معمولا به صورت پیشفرض مقدار صفر است.

بعد از ایجاد شئ از سوکت حال می‌توانید یک سرور و یا کلاینت را به صورت دلخواه با استفاده از متدهای موجود در ماژول سوکت ایجاد کنید.

ایجاد یک کلاینت ساده

قبل از اینکه شروع کنیم، بیایید نگاهی به متدهای سوکت کلاینت که موجود است بیاندازیم:

  • s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • s.connect(): ارتباط یک سرور TCP آغاز می‌شود.

حال برای ایجاد یک سوکت جدید شما ابتدا باید متد سوکت را از کلاس سوکت فراخوانی کنید:

import socket

بعد از آن یک سوکت (TCP) استریم را به صورت زیر ایجاد می‌کنیم:

stream_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

آرگومان AF_INET نشان می‌دهد که درخواست شما ی سوکت IP به صورت IPv4 است. آرگومان دوم نوع پروتکل انتقال برای سوکت‌های TCP است. اضافه بر این شما می‌توانید سوکت IPv6 را با قرار دادن آرگومان AF_INET6 ایجاد کنید.

تعیین کردن سرور:

server = "localhost"

تعیین کردن پورتی که از طریق آن می‌خواهیم ارتباط برقرار کنیم:

port =80 

اتصال سوکت به پورتی که سرور منتظر آن است:

server_address = ((host, port))

stream_socket.connect(server_address)

این نکته مهم است که هاست و پورت باید به صورت تاپل قرار گرفته شود.

ارسال یک درخواست داده به سرور:

message = 'message'
stream_socket.sendall(message)

دریافت پاسخ از سرور:

data = sock.recv(10)
print data

برای بستن یک سوکت متصل می‌توانید از متد بستن استفاده کنید:

stream_socket.close()

در زیر می‌توانید کد کامل مربوط به کلاینت/سرور را مشاهده کنید:

import socket
import sys
 
# Create a TCP/IP socket
stream_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# Define host
host = 'localhost'
 
# define the communication port
port = 8080
 
# Connect the socket to the port where the server is listening
server_address = ((host, port))
 
print "connecting"
 
stream_socket.connect(server_address)
 
 
# Send data
message = 'message'
stream_socket.sendall(message)
 
# response
data = stream_socket.recv(10)
print data
 
 
print 'socket closed'
stream_socket.close()

ایجاد یک سرور ساده

حال نوبت ایجاد یک سرور ساده در پایتون است. در زیر می‌توانید متدهای سرور سوکت موجود در پایتون را مشاهده کنید:

  • s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • s.bind(): متصل کردن آدرس‌ها (نام هاست و شماره پورت) به سوکت.
  • s.listen(): ایجاد و شروع TCP Listener.
  • s.accept(): پذیرش ارتباط کلاینت TCP.

در کدهای زیر قصد داریم که مراحل زیر را دنبال کنیم:

  • ایجاد یک سوکت.
  • متصل کردن سوکت به یک پورت.
  • شروع پذیرش ارتباطات روی سوکت.

اینجا می‌توانید برنامه سرور را مشاهده کنید:

import socket
import sys
 
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# Define host
host = 'localhost'
 
# define the communication port
port = 8080
 
# Bind the socket to the port
sock.bind((host, port))
# Listen for incoming connections
sock.listen(1)
 
# Wait for a connection
print 'waiting for a connection'
connection, client = sock.accept()
 
print client, 'connected'
 
# Receive the data in small chunks and retransmit it
 
data = connection.recv(16)
print 'received "%s"' % data
if data:
 
    connection.sendall(data)
else:
    print 'no data from', client
 
 
# Close the connection
connection.close()

حال سرور برای ارتباطات ورودی آماده است.

حال برنامه سرور و کلاینت را در ترمینال‌های جداگانه اجرا کنید، آن‌ها می‌توانند با همدیگر ارتباط برقرار کنند:

خروجی سرور

$ python server.py 
waiting for a connection
('127.0.0.1', 47050) connected
received "message"

خروجی کلاینت

$ python client.py 
connecting
message
socket closed

فریمورک Tornado

فریمورک Tornado یکی از کتابخانه‌های موجود برای برنامه‌نویسی شبکه در پایتون است. در این قسمت قصد داریم در رابطه با این فریمورک و چگونگی ایجاد وب سوکت‌ها صحبت کنیم.

Tornado یک وب فریمورک پایتون و یک کتابخانه برنامه‌نویسی شبکه به صورت غیرهمزمان است. Tornado از non-blocking network I/O استفاده می‌کند و قابلیت انعطاف‌پذیری با هزاران ارتباط باز را دارد. این ویژگی‌ها باعث می‌شود که برای ایجاد اپلیکیشن‌های مبتنی بر شبکه با قابلیت ارتباطات بلند مدت کاربران بسیار مناسب باشد.

بیایید یک وب سوکت ساده را با استفاده از Tornado ایجاد کنیم:

import tornado.ioloop
import tornado.web
 
 
class ApplicationHandler(tornado.web.RequestHandler):
 
    def get(self):
        self.message = message = """<html>
<head>
    <title>Tornado Framework</title>
 
</head>
<body
    <h2>Welcome to the Tornado framework</h2>
</body>
</html>"""
        self.write(message)
 
 
if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", ApplicationHandler),
    ])
    application.listen(5001)
    tornado.ioloop.IOLoop.instance().start()

در کد بالا:

  • ما کلاس ApplicationHandler که به عنوان یک هندلر (handler) برای دریافت‌ها و برگشت پاسخ‌ها به متد write() کار می‌کند را تعریف نمودیم.
  • متد main حالت ورودی به برنامه است.
  • tornado.web.Application یک پایه را برای اپلیکیشن‌های وب و جمع آوری مجموعه‌ای از Handlerها ایجاد می‌کند. مانند ApplicationHandler.
  • اپلیکیشن روی پورت ۵۰۰۰ قرار گرفته بنابراین مشتری می‌تواند با استفاده از همان پورت ارتباط برقرار کند. 
  • tornado.ioloop.IOLoop.instance().start() یک رشته nonblocking را برای اپلیکیشن ایجاد می‌کند.

اگر ما اپلیکیشن را اجرا کنیم، نتیجه‌ای مانند تصویر زیر را مشاهده خواهیم کرد:

پایتون

در پایان

تا به اینجای کار مطمئنا توانسته‌اید که موارد پایه‌ای در برنامه‌نویسی سوکت‌ها با استفاده پایتون را درک کنید. حال می‌توانید یک سرور ساده همراه با کلاینت را ایجاد کنید. می‌توانید اپلیکیشن چت خود را هم اکنون نیز اجرا کنید. برای اطلاعات بیشتر می‌توانید به مستندات پایتون مراجعه کنید. 

منبع

مقالات پیشنهادی

اهمیت برنامه‌نویسی تابعی در پایتون - مصاحبه با Steven Lott

پایتون در حال حاضر یکی از محبوب‌ترین زبان‌های برنامه‌نویسی در دنیا است. دلیل اصلی این محبوبیت مربوط به سادگی، سریع بودن و استفاده در پروژه‌های مختلف ت...

آموزش زبان برنامه نویسی پایتون – قسمت سوم

در واقع یک مقدار رو تولید کردیم، همونطور که گفتم هر مقدار، یک نوعی هم داره، توی این مثال نوع مقدار ما رشته یا String نام داره. انواع مختلفی از داده ها...

توسعه وب پایتون: جانگو در مقابل فلَسک در سال ۲۰۱۸

در دنیای توسعه پایتون، چندین نمونه از فریمورک‌ها و کتابخانه‌ها وجود دارد که در سال‌های اخیر رشد بالایی داشته‌اند، برای مثال می‌توان به Bottle و Cherry...

چرا پایتون برای مبتدیان انتخاب خوبی است؟

در ۵ سال اخیر که توسعه دهندگان بیشتر و بیشتر شدند، ما همیشه بدنبال قدم مناسبی برای شروع افراد مبتدی بودیم، ما بدنبال زبان برنامه نویسی گشتیم که دوستان...