برقراری ارتباطات در دنیای شبکه و اینترنت را میتوان مهمترین رکن اساسی به وجود آمدن این مفاهیم و ساختارها دانست. جهت ایجاد ارتباط بین دو مقصد میبایست بر بستر شبکه برنامه نویسی کرده و ارتباط را منتقل کنیم. در این مقاله به طور جامع با برنامهنویسی شبکه در پایتون آشنا خواهیم شد و ترفندهای سوکت نویسی شبکه با پایتون را بررسی میکنیم.
وقتی از یک شبکه کامپیوتری صحبت میکنیم، مفاهیم زیاد و بعضاً پیچیدهای برای انتقال دادهها روی کار میآید. اکثر زبانهایی که امکان برنامهنویسی شبکه را به ما میدهند، سعی کردهاند از این پیچیدگی کاسته و راهحل سادهای برای ما به وجود آورند.
زبان برنامهنویسی پایتون هم از جمله این زبانهاست. با پایتون به راحتی میتوان یک ارتباط بین دو برنامه بر روی یک شبکه ایجاد کرده و شروع به انتقال اطلاعات میان آنها کنیم.
سادهترین نوع انتقال اطلاعات، انتقال یک پیام متنی ساده است. همانطور که میدانید فایلها هم از رشتههای متنی و کدهای Hex تشکیل شدهاند. بنابراین ارسال پیام متنی در شبکه، مقدمه اصلی ارسال فایل در شبکه با پایتون است.
فهرست محتوای آموزش
سوکت در برنامهنویسی شبکه چیست ؟
سوکت (socket) در حقیقت یک لینک ارتباطی بین دو پردازش (process) یا به طور دقیقتر بین دو نخ (thread) بوده که برنامهها میتوانند از طریق آن با یکدیگر ارتباط برقرار کنند. این دو برنامه (یا thread) میتوانند روی یک سیستم و یا روی دو سیستم مختلف در مکانهای متفاوت باشند؛ مهم این است که یک ارتباطی از طریق شبکه با یکدیگر داشته باشند.
سوکتها به عنوان لینکهای ارتباطی بین دو کاربر استفاده میشوند تا امکان انتقال اطلاعات بین آن دو فراهم شود. به عنوان مثال، یک برنامه با معماری کلاینت سروری (معماری سرویسدهنده – سرویسگیرنده یا Client-Server) را در نظر بگیرید. سرور منتظر دریافت درخواست از سمت کلاینت و در نهایت واکنش نشان دادن به آن است و سرویسگیرنده نیز با ارسال درخواست به سرویسدهنده، خدماتی را دریافت میکند.
سوکت نویسی (برنامهنویسی سوکت)
هنگامی که در یک برنامه میخواهیم از سوکتها برای برقرار کردن ارتباطات استفاده کنیم، میبایست سوکت نویسی (برنامه نویسی سوکت یا socket programming) کنیم.
در فرآیند سوکت نویسی در ابتدا اطلاعات مربوط به مقصدی که میخواهیم به آن متصل شویم را تعریف کرده و سپس تلاش میکنیم تا به آن متصل شویم؛ پس از موفق بودن برقراری ارتباط، میتوانیم اطلاعات مورد نظر خود را میان این دو مقصد، تبادل کنیم.
چگونه برنامهنویسی شبکه را شروع کنیم ؟
برای ایجاد سوکت، به اطلاعات مقصد در ارتباط مورد نظر نیاز خواهیم داشت. همانطور که میدانید در یک شبکه کامپیوتری، هر نود با آدرسی موسوم به آدرس IP شناخته میشود که میتوان با استفاده از آن مقصد را شناسایی و بستهها را بر روی شبکه به سمت آن ارسال کرد.
گفتیم که سوکت به یک پردازش یا در حالت کوچکتر به یک نخ (thread) تخصیص مییابد. در صورتی که صرفاً از یک آدرس IP برای شناسایی مقصد استفاده کنیم، بر روی هر سیستم کامپیوتری، در هر زمان حداکثر میتوان یک سوکت داشت و به عبارتی فقط یک برنامه قابلیت استفاده از شبکه را داراست.
برای گسترش تعداد اتصالات در یک کامپیوتر، هر سوکت را با پورت مشخصی در آن سیستم مشخص میکنیم. یعنی یک آدرس ip به همراه پورت مشخصشدهی آن به thread مورد نظر تخصیص خواهد یافت.
معماری کلاینت سروری در ارتباطات شبکه
هنگامی که دو نود در یک شبکه (روی یک یا دو سیستم) بخواهند با هم ارتباط برقرار کنند، باید ساختار خاصی را رعایت کنیم. اصطلاحاً به این ساختار، معماری سرویسدهنده – سرویسگیرنده (Client – Server) گفته میشود.
به زبان ساده، در این معماری یکی از نودهای طرفین ارتباط سرویسی را ارائه میدهد و نود دیگر، میخواهد این سرویس یا خدماتی را دریافت کند. به نود سرویسدهنده اصطلاحاً سرور (Server) گفته و نود سرویسگیرنده به نام کلاینت یا مشتری (Client) شناخته میشود.
تقریباً تمام مسائل در برنامهنویسی شبکه به همین صورت در نظر گرفته میشود.
برای مثال، زمانی که شما آدرس این صفحه را در مرورگر خود باز کردید، درخواستی از سمت شما به سرور سبز دانش ارسال شده و درخواست محتوای موجود در این صفحه را کرده است. در طرف دیگر، سرور میزبان سایت ما، محتوای این صفحه (در ساختار کدهای html و css) را در پاسخ به درخواست شما، برایتان ارسال میکند.
در این ارتباط، کامپیوتر شما سرویس گیرنده و سرور ما سرویس دهنده بوده است.
برای درک بهتر کدهای ارائه شده در این مقاله آموزشی، سعی شده در قالب آموزش، مراحل ساخت برنامه چت با پایتون را پیش ببریم. در این سیستم، یک سرور و یک مشتری داریم؛ در ابتدا کاربر پیام Hello را به سرور ارسال میکند. سرور این پیام را دریافت و چاپ کرده؛ در نهایت پیامی مبنی بر دریافت درخواست به سمت کلاینت ارسال خواهد کرد.
سوکت نویسی با پایتون
برای برنامه نویسی سوکت در پایتون، میتوان از کتابخانه socket
استفاده کرد. کتابخانه socket
یک کتابخانه ساده برای برقراری ارتباطات بر بستر شبکه و برنامهنویسی شبکه در پایتون است.
در ابتدا این کتابخانه را به برنامه خود اضافه میکنیم. (در کدهای برنامه کلاینت و سرور)
import socket
مرحله اول برنامهنویسی شبکه: ایجاد سوکت جدید
همانطور که گفته شد، برای برقراری ارتباط نیاز به یک سوکت داریم. برای ایجاد سوکت در پایتون از تابع socket()
در کتابخانه اضافه شده استفاده میکنیم.
این تابع چهار ورودی میگیرد که هر چهارتای آنها به صورت پیشفرض تعریف شده و نیازی به تعریف آنها نخواهیم داشت. اما پیشنهاد میکنم دو مورد اولی را مشخص کنید.
s = socket.socket(socket_family, socket_type)
دو ورودی اول این تابع به ترتیب به صورت زیر تعریف میشوند:
- socket_family : این ورودی خانواده نوع آدرسدهی در ارتباط شبکه را مشخص میکند. نوع آن یک مقدار عددی است، اما میتوان مقادیر ثابت موجود در کتابخانه
socket
را نیز برای تعریف آن استفاده کرد. معمولاً ما در ارتباطاتهای عادی از مقدار ثابتsocket.AF_INET
برای آدرسدهی IP اینترنتی (Internet Protocol) نسخه 4 و ازsocket.AF_INET6
برای ارتباط IPv6 استفاده میکنیم. - socket_type : مشخصکننده نوع سوکت است. این ورودی هم یک مقدار عددی است و میتوان برای تعریف آن از مقادیر ثابت موجود در کتابخانه استفاده کرد. نوع سوکت نشاندهنده نحوه اتصال بین دو نود میباشد. معمولاً از مقدار
socket.SOCK_STREAM
برای ارتباط TCP و ازsocket.SOCK_DGRAM
برای اتصال UDP استفاده میشود.
متدهای برنامهنویسی شبکه در پایتون
تا به اینجای کار توانستیم یک سوکت در برنامه خود ایجاد کنیم. حال بسته به اینکه برای سرور کد میزنیم یا برای کلاینت، باید کارهای مختلفی انجام دهیم. در ادامه توابع و متدهای برنامه نویسی شبکه در پایتون را با هم بررسی میکنیم. پس از آن از همه آنها در ساخت برنامه چت پایتون استفاده خواهیم کرد.
توابع مربوط به سوکت سرور
متد bind برای تعریف آیپی و پورت
با استفاده از تابع bind()
که روی شئ از جنس سوکت صدا زده میشود، آدرس IP و پورت مورد نظر را تعیین میکنیم. توجه داشته باشید که پورتی که وارد میشود باید بر روی سیستم سرور آزاد بوده و توسط برنامه دیگری استفاده نشود.
متد listen برای محدودیت اتصال سوکت
این تابع میتواند برای تعداد کانکشنهای برقرار شده با سرور محدودیت مشخص کند. حداقل مقدار تعریف شده برای آن 0 و سقف آن با توجه به منابع سیستم سرور تعیین میشود. در صورتی که سرور این تعداد کانکشن را برقرار کرده باشد، در صورت دریافت درخواست برای ایجاد کانکشن جدید، آنرا رد خواهد کرد.
ما در مثال برنامه نویسی شبکه در پایتون با سیستم چت، مقدار 1 را برای این مورد در نظر میگیریم.
متد accept برای دریافت درخواست ارتباط
این متد درخواستهایی که برای سرور ارسال میشود را دریافت کرده و در صورت توان آن را قبول خواهد کرد. برنامه بر روی تابع accept()
به صورت بلاک شده خواهد ماند تا زمانی که درخواستی به سرور ارسال شود.
پس از دریافت و قبول یک ارتباط موفق (connection)، این تابع یک تاپل (tuple) را به عنوان خروجی باز میگرداند. این تاپل دو مقدار دارد:
- مقدار اول حاوی شئ ارتباط (کانکشن یا connection)
- مقدار دوم یک تاپل حاوی مشخصات کلاینت متصل شده میباشد.
توابع سوکت سمت کلاینت
متد connect برای برقراری ارتباط شبکه
با استفاده از متد connect()
، درخواست ایجاد کانکشن را از طرف سرویس گیرنده به سرور مقصد ارسال کرده و ارتباط کلاینت با سرور را آغاز میکنیم.
ورودی تابع connect()
یک زوج دوتایی مرتب است که آدرس IP و پورت مقصد را مشخص میکند.
اگر فرض کنیم آیپی مقصد 192.168.1.25 بوده و پورت مورد نظر ما 8650 است، آن را به صورت زیر تعریف میکنیم.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((192.168.1.25, 8650))
توابع اصلی سوکت نویسی با پایتون
متدهای زیر را میتوان در هر دو طرف ارتباط شبکه (سرور یا کلاینت) استفاده کرد.
متد recv برای دریافت پیام در شبکه
این متد که بر روی کانکشن ایجاد شده صدا زده میشود، مقدار ارسال شده در اتصال TCP را دریافت کرده و به عنوان خروجی به ما میدهد. هنگام استفاده از این تابع، برنامه روی این خط بلاک شده و تا زمانی که پیامی در ارتباط دریافت نکند، پیشروی نخواهد کرد.
تابع recv()
یک مقدار عددی به عنوان ورودی دریافت میکند. این عدد نشاندهنده تعداد حداکثر بایتهایی است که باید از خروجی بخواند. یعنی به وسیله آن مشخص میکنیم که برنامه ما حداکثر چند بایت از پیام دریافت شده را بخواند. (به این مقدار اصطلاحاً buffer size گفته میشود.)
این مقدار را میتوانید با توجه به ماهیت برنامه خود، بر روی مقدار دلخواهی تنظیم کنید. همانطور که میدانید حروف انگلیسی هر کدام معادل یک بایت هستند.
متد send برای ارسال پیام در شبکه
این متد برای ارسال دادهها بر بستر ارتباط ایجاد شده در شبکه استفاده میشود. تابع send()
یک ورودی به صورت اجباری میگیرد که همان اطلاعاتی است که باید به مقصد (آن سوی ارتباط TCP) ارسال شود.
ورودی تابع میبایست به صورت byte و با encode مشخص باشد؛ بنابراین در صورتی که بخواهیم یک رشته را ارسال کنیم، باید ابتدا بر روی رشته مورد نظر متد encode()
را صدا زده و خروجی آن را ارسال کنیم.
recvfrom برای دریافت پیام در ارتباط UDP
اگر در برنامه نویسی شبکه با پایتون از ارتباط UDP برای ارسال دادهها استفاده میکنید، متد recvfrom()
برای دریافت پیام تعریف شده است.
sendto برای ارسال پیام در ارتباط UDP
در سوکت نویسی با پایتون بر بستر ارتباط UDP از متد sendto()
برای ارسال پیام به مقصد استفاده میشود. به عنوان سومین ورودی این تابع، میتوان مقصد (زوج آدرس و پورت) را تعریف کرد.
بستن ارتباط شبکه با close
در ابتدای ایجاد کانکشن، ما یک کانکشن به آن طرف ارتباط ایجاد کرده و یک پورت را مشغول کردهایم. با صدا زدن تابع close()
روی کانکشن ایجاد شده، کانکشن را بسته و پورت را آزاد میکنیم. بدیهی است که این کار در انتهای کارمان صورت خواهد پذیرفت.
ساخت برنامه چت با پایتون
برای ساخت برنامه چت در پایتون نیاز به دو فایل مختلف داریم، اولی به عنوان سرور (server.py
) و دومی به عنوان کلاینت (client.py
) شناخته خواهند شد.
ایجاد سوکت سرور و اتصال به سرور
ابتدا میبایست در سرور یک سوکت روی پورت مورد نظر ایجاد کرده، شنود TCP را روی آن فعال کنیم. با این کار، منتظر دریافت درخواست ایجاد کانکشن میمانیم.
بیایید با استفاده از دستور socket()
یک سوکت برای ساخت برنامه چت در پایتون ایجاد کنیم.
چون قرار هست هر دو فایل روی یک سیستم اجرا شوند و خبری از دو سیستم با دو آدرس IP متفاوت نیست، آدرس مقصد را localhost
یا آدرس 127.0.0.1
معرفی میکنیم؛ یعنی مقصد روی همین سیستم است.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 14200)) s.listen(1) #Waiting For a Connection connection, client = s.accept()
همچنین در سمت مشتری (client) نیز یک سوکت ایجاد کرده و تلاش میکنیم تا به مقصد localhost
و پورتی که در سرور تعریف کردهایم (در اینجا 14200) متصل شویم.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #connecting s.connect(("localhost", 14200))
هنگامی که سرور در حال اجرا و منتظر دریافت درخواست ایجاد ارتباط باشد و خط ششم قطعه کد کلاینت اجرا شود، یک ارتباط TCP بین دو برنامه ایجاد خواهد شد. پس از ایجاد شدن ارتباط، سرور که منتظر دریافت پیام بود، از حالت بلاکِ روی خط نهم آزاد شده و ادامه کدهایش را اجرا میکند.
ارسال و دریافت پیام در شبکه
حال که ارتباط ما به سرور ایجاد شد، میخواهیم از طریق کلاینت پیامی به سرور ارسال کنیم. پس در ادامهی اتصال کانکشن در کلاینت مینویسیم:
message = "Hello" s.send(message.encode())
همانطور که گفته شد، پیامها بر روی سوکتها به صورت byte ارسال میشوند. در نتیجه میبایست رشته متنی را با استفاده از تابع encode()
به رشتهی بایتی تبدیل کنیم.
میخواستیم پس از آنکه پیاممان را به سرور ارسال کردیم، یک پیام تأیید از آن دریافت کنیم.
پس در ادامه، منتظر دریافت تایید از سمت سرور مانده و پیام را دریافت کنیم. این کار را به راحتی با استفاده از تابع recv()
انجام خواهیم داد.
data = s.recv(32) print(data.decode())
و در پایان کانکشن ایجاد شده را به کمک متد close()
میبندیم.
#Connection Closed s.close()
برای دریافت و ارسال پیام در سمت سرور، به طور کاملاً مشابه عمل خواهیم کرد. یعنی در ادامه کدهای قبلی server.py
قطعه کدهای زیر را خواهیم نوشت.
print(client, 'Connected') data = connection.recv(32) print('Received "' + data.decode() + '"') connection.send("Message Received!".encode()) connection.close()
- در قطعه کد بالا، پس از برقراری کانکشن، اعلام میکنیم که یک کلاینت به سرور متصل شد و اطلاعات (آدرس IP و پورت) آن را چاپ میکنیم. (خط اول)
- سپس منتظر دریافت پیام از کلاینت خواهیم ماند و پس از دریافت، آن را چاپ میکنیم. (خط 3 و 4)
- بعد از آن پیام موفقیت آمیز بودن عملیات دریافت پیام را برای client ارسال میکنیم. (خط 6)
- در انتها نیز ارتباط را از سمت سرور قطع میکنیم. (خط هشتم)
تبریک! شما به کمک سوکت نویسی در پایتون توانستید یک ارتباط کلاینت سروری ساده ایجاد کنید. به طور کلی برای داشتن یک برنامه چت در پایتون کدهای زیر را خواهیم داشت.
کدهای سرور چت با پایتون
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 14200)) s.listen(1) #Waiting For a Connection connection, client = s.accept() print(client, 'Connected') data = connection.recv(32) print('Received "' + data.decode() + '"') connection.send("Message Received!".encode()) connection.close()
کدهای کلاینت چت پایتون
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #connecting s.connect(("localhost", 14200)) message = "Hello" s.send(message.encode()) data = s.recv(32) print(data.decode()) #Connection Closed s.close()
سیستم چت پیشرفته
در این مثال، از سمت کلاینت یک پیام ارسال و یک پیام نیز دریافت کردیم. در صورتی که این توابع را درون یک حلقه شرطی گذاشته و تا زمان دلخواهی آن را اجرا کنیم، میتوانیم بارها و بارها پیامهای مختلفی را به سمت سرور ارسال و دریافت کنیم.
جمعبندی: برنامه نویسی شبکه در پایتون
در این مقاله آموزشی به چگونگی سوکت نویسی در پایتون پرداختیم. در ابتدا فهمیدیم که برای برقراری یک ارتباط در شبکه از سوکتها استفاده میکنیم. یک سوکت با IP و پورت طرف مقابل مشخص میشود.
پس از ایجاد سوکت، از ارتباطات TCP یا UDP استفاده میکنیم. به این منظور از متدهای recv()
و send()
در ارتباط TCP و از متدهای recvfrom()
و sendto()
در ارتباط UDP در برنامه نویسی شبکه با پایتون استفاده خواهیم کرد.
در انتهای مقاله فرآیند برنامهنویسی برنامه چت در پایتون را مرور کردیم و توانستیم یک برنامه چت ساده با تبادل دو پیام متنی داشته باشیم.
فرآیند برنامهنویسی شبکه در پایتون میتواند بسیار پیچیدهتر از ارسال یک رشته متنی باشد. هر چند که میتوان تمام دادهها را به نوعی رشتهی متنی تبدیل کرد، اما برای سایر نوعهای دادهای متدها و کتابخانههای مخصوصی وجود دارد.
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام به نظرم بسیار ساده و مفید آموزش داده شده. اگه ممکنه درسی که آموزش داده میشه به صورت یک فیلم کوتاه هم تو سایت بذارید خیلی به یادگیری برای ما کمک میکنه.
درصورت امکان آموزش دریافت فایل صوتی و تصویری از طریق شبکه را هم ارائه بفرمایید.
سلام
ممنون بابت پیشنهادتون. آموزشهای پرکاربردمون به صورت ویدئویی هم در حال انتشار یا ضبط هستند. سیستم تعاملی یادگیری کالج هم میتونه رند یادگیریتون رو بهتر کنه. پیشنهاد میکنم یه سری بهش بزنید.
سلام
در حالت کلی، فایل صوتی و تصویری هم مثل یک پیام متنی ارسال میشن. یعنی شما کدهای اون فایل رو به صورت متن بر بستر شبکه ارسال میکنید و در مقصد اونها رو کنار هم قرار میدید تا فایل به درستی اجرا بشه.
البته قطعاً ماژولهایی برای انتقال یک فایل هست که شما درگیر جزئیات نشید و بتونید راحتتر این کار رو انجام بدید. چون مثلاً یه فایل حجیم رو باید به بخشهای کوچیک تقسیم کنید، اینها رو به ترتیب در مقصد کنار هم بذارید و مشکلات مربوط به اختلال در ارسال رو مدیریت کنید. برای این ماژولها یه جستجو کنید احتمالاً به گزینههای متنوعی برخورد کنید.
یه ویدئوی نسبتاً قدیمی هم درباره سوکت نویسی پایتون در آپارات دارم که اگه خواستید میتونید یه نگاهی بندازید:
aparat.com/v/8CnD5
سلام دوست عزیز میتونم یک پروژه به سوکت نویستون ارائه بدم برای اپلیکیشنم
سلام
ایمیلی که فرستادید رو دیدم و امروز ارجاعش دادیم. بهزودی از طریق همون پیام جوابتون رو میدیم.
عالی بود
خیلی ممنون بابت آموزش
خوشحالیم که برات مفید بوده محمد عزیز
سلام و عرض ادب ، سپاسگزارم از اطلاعات و آموزش های مفیدتان.
منتها برای من یه سوال پیش اومده که وقتی میخواهیم یک سرور با دوتا کلاینت در ارتباط باشه و پیام ها رد و بدل بشه.
به نظر شما باید چی کار کرد؟
ممنون میشوم که مرا راهنمایی کنید.
سلام
میتونید از چند پردازشی یا threading استفاده کنید؛ آموزش اولی الآن توی سایت موجوده و برای دومی هم به زودی آموزشی منتشر میکنیم.
سلام خیلی ممنون از اموزش خوبتون
من میخواستم بین دو تادستگاه این کار رو کنم اما هر کار می کنم نمیشه .اگه لطف کنین بگین چطوری ای پی رو وارد کنم و اینکه هردو دستگاه به مودم خونگی وصل میشن .ای پی خود کامپیوتر رو دارم اما نمی دونم تو کدوم بزارم (سرور یا کلاینت)
دستگاه دیگر هم گوشیه که توش پایتون اندروید رو نصب کردم .اگه لطف کنین و راهنمایی کنین ممنون میشم
سلام
وارد کردن پورت هیچ تفاوتی نداره.
در سناریوی شما یه مورد ممکنه ایجاد اختلال کنه. اونم فایروالها و آنتی ویروسهایی هست که روی سیستمها داخل شبکه وجود دارند. فایروالها پورتهای غیرلازم و غیرخاص رو برای ارتباط با بیرون قطع میکنند تا از مشکلات ناخواسته جلوگیری بشه.
پیشنهاد میکنم فایروال کامپیوتر (و اگر روی گوشی چیزی دارید) رو موقتاً غیرفعال و کدتون رو تست کنید.
چقدر عالی بود آموزش هاتون و اینطور بی دریغ در اختیار عموم قرار دادین .خدا به شما توفیق روز افزون عنایت کند .
خیلی خوشحالیم که از آموزشهامون راضی هستید و اونها رو مفید میدونید. مرسی برای انرژی خوبی که بهمون دادید 🙂
ممنون استاد از جوابگویتون
اگه بخوایم تو کلاینت یک و دو تغیری بدیم که چت ارسالی از هر یک از کلاینتها که به سرور میزسد به دیگر کلاینت هم برسد چه تغییری لازم است
اطفا راهنمایی نمایید
سلام
اگه میخواید با همین سوکت نویسی پایتون انجامش بدید میتونید قسمتی که پیام کلاینت رو میگیره، به بقیه کلاینتها (غیر از فرستنده) یک پیام send کنه.
پیشنهاد میکنم کلاینتهاتون رو وقتی accept میشن توی یک لیست نگه دارید تا بتونید بهشون دسترسی داشته باشید.
سلام استاد گرامی
برای ساخت یک سرور و دو کلاینت تو برنامه چتی که نوشتید چه تغییر و تحولی باید بدیم که تداخل پیام بوجود نیاد
سلام
شما مقدار listen رو که افزایش بدید میتونید چندین کلاینت رو به یک سرور متصل کنید. اگه میخواید تشخیص بدید هر پیام توسط کدوم کلاینت ارسال شده، از شیء client که توسط متد
accespt()
برگردونده میشه میتونید استفاده کنید.روی لوکال چندتا سرور میتونم بسازم؟
اگه به این روش کار کنید (هر پورت فقط برای یه اسکریپت سرور) به تعداد پورتهای فعال روی سیستمتون. اگه کلاینت ها هم روی همین سیستم باشن این تعداد نصف میشه. در مجموع خیالتون راحت باشه!
هر چند تا که بخوای فقط پورت ها باید متفاوت باشند
خدا خیرتون بده اموزشتون خیلی بهم کمک کرد
سلام، چرا نمیشه با دو تا کلاینت به سرور همزمان وصل شد؟
سلام
قسمتی که
s.accept()
رو داریم، منتظر ایجاد یک کانکشن روی شبکه میمونه. در کدهای این آموزش، وقتی از این خط عبور میکنیم دیگه چنین دستوری نداریم، پس سرور هم منتظر دریافت کانکشن جدیدی نیست!برای اینکه کلاینتی بتونه به سرور متصل بشه، باید سرور منتظر یک ارتباط جدید (با همین متد) باشه.
میتونید یک حلقه while بذارید که فقط connection جدید رو بگیره و با چند پردازشی در پایتون، یک پردازش برای دریافت و پردازش پیامهای هر کانکشن ایجاد کنید.
خیلی ممنون:)
سلام ممنونم بابت پاسخ به سوال یک سوال دیگه داشتم
با چه کدی میشه یک شماره رو شماره گیری کرد در پایتون
برای مثال شماره ای رو به پایتون بدیم که با هر بار اجرا با شماره تماس بگیره حقیقتش برای اندروید لازم داشتم قبلا ساخت دفترچه تلفن با پایتون رو خوندم و این سوال برام پیش اومد که اگه شماره هارو ساختیم حالا چطوری میشه باهاشون تماس بگیریم
سلام
باید جستجو کنید که چطور با سرویسهای اندروید ارتباط برقرار میشه و درخواست تماس رو به سیستم عامل بدید. ما اطلاعی نداریم.
سلام ممکنه کدی بنویسیم که هرکسی اون رو اجرا کرد بدون اتصال به اینترنت به اینترنت شخصی خودمون متصل بشه یعنی با اینترنت سیستم خودمون بتونه آنلاین باشه
سلام
منظورتون اینه که توی شبکه داخلی، از اینترنت یک کامپیوتر دیگه استفاده کنید؟!
اگر فقط یک برنامه خاص مد نظر باشه، با کدنویسی میتونید چنین کاری انجام بدید. اما اگر کل سیستم رو میخواید آنلاین کنید شاید راحتترش تنظیمات شبکه باشه؛ به نوعی باید gateway ارسال بستههای اینترنت رو سیستم دوم قرار بدید و ابزارها یا نرمافزارهایی هم روی سیستم دوم برای هدایت این بستهها به اینترنت و برگشت اونها اجرا کنید.
سلام ببخشید یه مشکلی داشتم
من دارم برنامه ای مینویسم که نیاز داره به طور مداوم ارتباط و انتقال داده بین دو سیستم برقرار بشه
وقتی روی localhost امتحان کردم کار میکرد
ولی وقتی server و client رو روی کامپیوتر و لپتاپم پیاده کرده ام ولی هر کاری کردم به هم متصل نمیشند
میشه توضیح بدید که اصلا پیش نیاز های اتصال دو سیستم به هم چیه؟
به طور مثال باید دو سیستم به یک وای فای وصل بشند ؟ یا از راه دور هم میشه ؟ ممکنه مشکل از port باشه ؟ یا مثلا ایراد از ip باشه ؟
عذر میخوام متن طولانی شد ولی میشه راهنماییم کنید
سلام
لازمه ارتباط یک آی پی (آدرس روی شبکه) هست! حالا اگر روی localhost کار میکنید، ip میشه
127.0.0.1
اگر روی شبکه داخلی قراره کار کنید، باید ip داخلی هر سیستم رو بزنید. همینطور اگر روی اینترنت هستید.دو تا موضوع رو در نظر داشته باشید:
سلام من سرور رو کامپیوترم اجرا می کنم و کلاینت رو تو سرور مجازی تو سرور مجازی این ارور رو میده :
سلام علی عزیز
شما دارید ip داخلی سیستمتون رو وارد میکنید و این ip فقط داخل شبکه داخلی (مثل خونه) معتبره!
میتونید از آی پی اینترنتتون استفاده کنید. (از طریق سایتهای what is my ip میشه پیدا کرد) البته احتمال زیاد فایروال کامپیوتر و مسیریابی مودمتون چالش ایجاد کنه.
سلام خسته نباشید من مدتی هست که مشکلی دارم یک هاست دارم و مشکل من به این صورت هست که فرض کنیم یک برنامه ای داریم وقتی اون رو اجرا میکنیم اسکرین شاتی از صفحه ما میگیره و به هاست ارسال میکنه برنامه با زبان پایتون نوشته شده البته این پلان هست مشکل من دقیقا همینجاست که نمیدونم ارسال عکس به هاست با زبان پایتون به چه صورت هست و باید دقیقا چطور هاست رو به برنامه معرفی کنم که عکس رو دریافت کنه، یک Ftp دارم اگه راهی داره و از این طریق میشه بگین اگر هم نمیشه روش دیگری برای ارسال عکس و ذخیره سازی عکس از سیستم های مختلف تو هاست کدی دارین؟
سلام
اگراز سوکت نویسی میخواید استفاده کنید، میتونید فایل عکس رو به صورت باینری روی شبکه ارسال کنید. در سمت سرور یک رشته متنی دارید که باید درون یک فایل با فرمت مورد نظر قرارش بدید. (کار با فایل در پایتون میتونه کمکتون کنه)
با ftp هم میتونید. خیلی وقت هست با انتقال ftp پایتون کار نکردم. مستندات کتابخونه
ftplib
احتمالاً کمککننده خواهد بود.موفق باشید.
سلامی دوباره ممنونم که اینقدر سریع جواب دادین نسبت به بقیه سایت ها واقعا ممنون امیدوارم موفق و پیروز باشید
من از کد زیر برای ارسال استفاده کردم ولی جواب نداد نمیدونم شاید مشخصات Ftp رو اشتباه وارد کردم بهرحال کد رو میفرستم اگر صلاح دونستید و زحمتی نداشت کمکم کنین که کجا اشتباه کردم ممنونم
سلام، خواهش میکنم. خوشحالم که راهنماییهام تا حدی کارساز بوده.
کد زیر رو برای انتقال تست کردم و به درستی انتقال داد. اگر همچنان خطا دارید، کد رو داخل IDLE (اجرای پایتون) خط به خط اجرا کنید، شاید به دلیلش برسید.
سلام خیلی عالی بود
ایا ممکنه که client به server پیامی ارسال کنه که دوطرفه باشه؟؟
درود
منظورتون از دو طرفه بودن چیه؟! یعنی سرور بتونه پاسخ بده؟ اگر اینطوره که میتونید از سمت سرور هم به کلاینت پیام بدید.
اره دقیقا منظورم همینه که ایا میشه که client هم به server پیغامی بفرسته
اگه ممکنه بگید با چه تابعی میشه
بله میشه!
توی کدهای سرور و کلاینت در بخش انتهایی از تابع
send()
برای ارسال پیام در کانکشنی که ایجاد شده استفاده کردم. از این دستور برای ارسال پیام متنی میتونید استفاده کنید.اگر هم نیازه فرآیند دریافت و ارسال پیامتون مداوم باشه، میتونید از حلقهها یا در حالت حرفهایتر از چند پردازشی پایتون استفاده کنید.
سلام
خسته نباشید.
خیلی ممنون از شما مقاله تون عالی بود واقعا لذت بردم.
خوشحالم که براتون مفید بوده سبحان عزیز
موفق باشید.
اصلا من نفهمیدم چطوری هست
سلام هادی عزیز
اگر جایی نیاز به توضیح هست بپرس تا در حد امکان بیشتر راهنماییتون کنم.
سلام و ممنون از توضیحات کاملتون
میشه بفرمایید اگر به جای متن بخوایم فایل صوتی دریافت و بعد اجرا کنیم چطور میشه؟
سلام
تا جایی که اطلاع دارم معمولاً بیت به بیت فایل رو به صورت کاراکتر رشتهای ارسال میکنند و در مقصد اونها را با فرمت مورد نظر ذخیره میکنند.
سلام.
من دستورات شما رو تو یه سیستم میزنم همه چیز اوکیه ولی وقتی کد سمت سرور رو میندازم تو سرور و آیپی سیستم خودمو میدم موقع اجرا این ارور رو میده
سلام
دقت کنید که توی شبکه باید ipهای سیستمها رو بدید. آیپی سرور که مشخصه اما ip سیستم شما، میشه ip اینترنتتون!
توی قطعه کدی که فرستادید، آی پی داخل شبکه کامپیوترتون رو وارد کردید! با جستجوی what is my ip سایتهایی هستند که ip اینترنت شما رو میدن.
البته این ip ثابت نیست مگر اینکه آی پی استاتیک برای سرویس اینترنتتون بخرید.
موفق باشید.
سلام با تشکر از مقاله خوبتون. ممنونم بیان تون عالی بود.
سئوالی داشتم. اگر بخواهیم تعداد client session هایی که وارد سیستم میشن رو ثبت کنیم و هر بار شخصی که می خواهد به سرور وصل شود پیامی شامل اسم کلاینت و تعداد کل کانکشن ها پخش شود چه تغییری باید ایجاد کنیم
سلام
خوشحالم که این آموزش براتون مفید بوده
برای شمارش کل کانکشنها بهتره یه متغیر داشته باشید و زمان وصل شدن هر کلاینت یکی بهش اضافه و در زمان قطع شدنش یکی از اون کم کنید.
برای کار دوم، میتونید تمام کانکشنها (متغیر
connection
در کد سرور) رو در یک لیست نگهداری کنید.حالا هر زمان که نیاز شد، در یک حلقه پیام رو برای تک تک کلاینتها ارسال کنید.
در کد سرور متغیر
client
اطلاعات مربوط به کلاینت رو داره (آیپی یا نام هاست و پورت اتصال) که شما بهترهhost/ip
رو برای همه مخابره کنید.موفق باشید.
سلام من در پایتون تازه کارم و دارم یاد می گیرم می خواستم توضیح بدید چطور می توانیم هم کلاینت و هم سرور باشیم چون هر وقت دو نفر باهم چت می کنند هر دو هم سرور هستند هم کلاینت چطور اجرای همزمان این دو کد رو فراهم کنیم که بشه واقعی با کسی چت کرد … اگر توضیحش پیچیده هست براش یک منبع معرفی کنید تا بتونم بعدا مطالعه کنم با تشکر از مطالب خوبتون
سلام
دقیقاً همینطوره که گفتید.
برای اینکه همزمان هم کد کلاینت در حال اجرا باشه و هم سرور، میتونید از نخها یا thread در پایتون استفاده کنید.
کافیه قسمتی در سرور که منتظر دریافت پیام از کلاینت هست رو یک
thread
و قسمتی که منتظر وارد کردن متن و ارسال اون هست رو یکthread
دیگه در نظر بگیرید.قبلا در مورد چند پردازشی در پایتون توضیحات مختصری دادهام؛ میتونید برای آشنایی با چگونگی تعریف فرآیندها اون رو هم مطالعه کنید.
اما حتماً در مورد
thread
ها جستجو کرده و برای دو بخش اصلی برنامهتون استفاده کنید.موفق باشید.
سلام بسيار ممنونم از مقاله خوبتون
ببخشيد سرورم مشكلي نداره،اما كلاينتم بعد از ران اين پيام رو مي ده:
لطفا راهنمايي ام كنيد.
سلام
خوشحالم که مقاله مورد استفادتون قرار گرفته
این خطا دلایل زیادی میتونه داشته باشه؛ موارد زیر بعضی از رایجترینها هستند که بهتره بررسیشون کنید:
– وجود نداشتن
listener
در سرور– مشکل در تعریف آدرس هاست (
localhost
یاip
سرورتون)– اگر سرور و کلایت روی دو ماشین مختلف هستند، فایروالهای سیستم سرور باید اجازه اتصال روی پورت مورد نظر رو بدن؛ این مورد رو بررسی کنید و میتونید فایروالها رو موقتاً غیر فعال کنید.
موفق باشید.
سلام ممنون از آموزش خوبتون
به طور مثال اگر دو رایانه رو با وای فای به هم متصل کنم به جای عبارت
localhost
باید چه مقداری رو قرار داد ؟ ( آدرس شبکه وای فای متصل شده رو چگونه باید به دست آورد ؟ )سلام
خوشحالیم که مقاله مورد استفادتون قرار گرفته!
اگر میخواید در سطح یک شبکه کار کنید، باید آدرس
IP
دستگاه مقابل رو به جایlocalhost
وارد کنید.در شبکه وایرلس، میتونید با اجرای دستور
ipconfig
در کامندلاین یاCMD
هر دستگاه از قسمت Wireless LAN adapter Wi-Fi آدرسIPv4
رو مشاهده کنید.موفق باشید
سلام.سپاس از مطلب خوبتون.
یه پرسش داشتم.من شنیده بودم که برای ارتباط دو رایانه باید اونا رو با سیم وصل کنیم.آیا این درسته؟؟؟؟؟؟
سلام
ارتباط بین دو کامپیوتر به کمک شبکههای کامپیوتری انجام میشه. این شبکه میتونه با سیم یا بدون سیم (مثل WiFi) باشه! این شبکه میتونه خصوصی و فقط منحصر به خود شما باشه یا روی بستر اینترنت اجرا بشه. شبکههای کامپیوتری گستره وسیعی دارند و با پیشرفت فناوری به شکلهای مختلفی قابل پیادهسازی هستند…
موفق باشید.
درود و خسته نباشید.
یک سوالی برایم پیش آمده فرق بین connect و connect_ex چیست؟؟
سلام
تا جایی که من اطلاع دارم، این دو دستور شبیه هم هستند و تنها تفاوتشون اینه که:
connect
در صورت اتصال موفقیت آمیز، یک رشته (string) برمیگردونه و در غیر اینصورت هیچ چیزی به ما نمیدهد.connect_ex
در صورت اتصال موفقیتآمیز عدد 0 و در غیر اینصورت یک عدد که مشخص کننده کد نوع خطاست به عنوان خروجی برمیگرداند.موفق باشید
سلام چطور میشه با استفادی از کتابخانه
cv2
به جای رشته تصویر فرستاد؟؟ممنون میشم جواب بدید خیلی گیرم.!سلام
تا جایی که اطلاع دارم کتابخونه
cv2
برای پردازش تصویر هست و مرتبط با شبکه نیست.اما در کل برای ارسال تصویر، میتونین اون رو با استفاده از
base64
کد کرده و رشتهی نتیجه شده رو ارسال کنید.در مقصد هم رشته دریافتی رو با همین روش دیکد کرده و ذخیرش کنید.
سلام
ممنون از مطلب خوبتون. من میخوام کدی بنویسم که به سرور یک وب سایت وصل بشم و برنامم از امکانات اون سلیت استفاده کنه. ممنون میشم راهنماییم کنید
سلام
خوشحالیم که این مقاله تونسته راهنمای خوبی براتون باشه!
اگر سایت مورد نظر، سایت خودتون هست میتونید با ایجاد API از امکانات سایت استفاده کنید. بعضی از سایتها هم برای کار با امکاناتشون به شما API ارائه میدن.
در اینصورت میتونید از کتابخونههای پایتون نظیر
urllib
وrequests
برای ارسال درخواستها استفاده کنید.اگر API ندارید، میتونید رفتار کاری که در نظر دارید انجام بشه رو در سایت بررسی کرده و اطلاعات مورد نیاز رو با استفاده از همین کتابخونهها برای سایت بفرستید.
موفق باشید
سلام خسته نباشید ازتون ممنونم …مطالبتون خیلی به بنده کمک کرد …
سلام
خیلی خوشحالیم که تونستیم کمکتون کنیم!