در این آموزش از سری آموزش زبان برنامه نویسی پایتون در سایت چ یاب قصد داریم به بررسی یک پروژه بپردازیم. پروژه ی چت ساده با استفاده از برنامه نویسی سوکت! تا انتهای پست همراه ما باشید… همچنین در آخر میتوانید ویدیوی آموزش اجرای این پروژه را ببینید.
بله در ادامه یاد میگیرید که به راحتی یک برنامه برای ایجاد ارتباط بین یک سرور و کلاینت ایجاد کنید و محیطی برای چت بین دو طرف فراهم آورید. اگر به دنبال آموزش زبان برنامه نویسی پایتون رایگان میگردید؛ میتوانید به “محبوب مثل پایتون!” مراجعه کنید. این پست مقدمهای مناسب بر زبان پایتون است.
در زبان برنامه نویسی پایتون، سوکت یا network socket یک ماژول برای ایجاد ارتباطات بین دو کامپیوتر است. این ماژول از دو واسط برای دسترسی به شبکه استفاده میکند. یکی low-level نام دارد و اتصالات آن وابسته به پلتفرم هستند؛ مانند Telnet و دیگری high-level است و اتصالات آن واسته به اپلیکیشن یا لایه کاربرد شبکه هستند. مانند HTTP، FTP و SMTP. در این آموزش به طور اختصاصی یک ارتباط سوکت بین سرور و کلاینت ایجاد میکنیم و با استفاده از پروتکل TCP/IP پیامها را بین دو کامپیوتر جابجا میکنیم.
برای ایجاد چنین ارتباطی نیازمند دو کد پایتون جداگانه هستیم. یک کد یا اصطلاحا اسکریپت برای سرور و دیگری برای کلاینت. سرور یک دعوت نامه برای کلاینت میفرستد و پس از پذیرفتن این دعوت نامه توسط کلاینت، ارتباط برقرار میشود و پیامها رد و بدل میشوند.
اسکریپت سرور (server)
برای ارتباط با کلاینت، در قسمت سرور باید یک سری از توابع به صورت متوالی فراخوانی شوند. این توابع socket، bind، listen و accept هستند که برای ایجاد ارتباط با هر کلاینت در زبان پایتون باید فراخوانی شوند. یعنی اگر میخواهید با بیش از یک کلاینت ارتباط برقرار کنید باید دوباره این توالی را تکرار کنید.
توضیحات مربوط به مهمترین توابع استفاده شده در کد پایتون برنامهی چت، در ادامه آمده است:
- socket: با استفاده از مشخصاتی همچون آدرس، نوع سوکت و پروتکل، یک سوکت ایجاد میکند.
- bind: سوکت را به آدرس داده شده متصل میکند. (نام هاست یا میزبان، شماره پورت )
- listen: سرور را قادر میسازد تا ارتباطات از طرف کلاینت را ببیند و بپذیرد.
- accept: صبر میکند و درخواست ارتباط از طرف کلاینت را میپذیرد.
- gethostname: نام هاست یا اصطلاحا میزبان ماشین را برمیگرداند.
- gethostbyname: نام هاست را میگیرد و آدرس IPv4 آن را بازمیگرداند.
- recv: پیامهایی را که در ارتباط TCP ارسال شدهاند، دریافت میکند.
- decode: با استفاده از روشهای مخصوص، پیام را از حالت کد شده خارج میکند و به همان حالت قابل فهم تبدیل میکند.
- send: پیامهایی را که در TCP آماده شدهاند ارسال میکند.
اما برنامه نویسی سوکت در زبان پایتون به این چند تابع محدود نمیشود؛ اگر مایل هستید بیش از این در مورد سوکت پروگرمینگ در زبان برنامه نویسی پایتون بدانید، میتوانید به سایت رسمی پایتون مراجعه کنید.
کد سرور:
# server.py import time, socket, sys print("\nWelcome to Chat Room\n") print("Initialising....\n") time.sleep(1) s = socket.socket() host = socket.gethostname() ip = socket.gethostbyname(host) port = 1234 s.bind((host, port)) print(host, "(", ip, ")\n") name = input(str("Enter your name: ")) s.listen(1) print("\nWaiting for incoming connections...\n") conn, addr = s.accept() print("Received connection from ", addr[0], "(", addr[1], ")\n") s_name = conn.recv(1024) s_name = s_name.decode() print(s_name, "has connected to the chat room\nEnter [e] to exit chat room\n") conn.send(name.encode()) while True: message = input(str("Me : ")) if message == "[e]": message = "Left chat room!" conn.send(message.encode()) print("\n") break conn.send(message.encode()) message = conn.recv(1024) message = message.decode() print(s_name, ":", message)
اسکریپت کلاینت (client):
کد مربوط به کلاینت نیز مانند کد سرور، یک توالی از توابع دارد. توابعی همچون socket و connect که برای ارتباط با سرور مورد استفاده قرار میگیرند. در ادامه نیز توضیحات کوتاهی در مورد این دوتابع آورده ایم:
- socket: یک ارتباط سوکت با استفاده از آدرس، نوع سوکت و پروتکل ایجاد میکند.
- connect: به سرور سوکت در آدرس مشخص، متصل میشود.
کد کلاینت:
# client.py import time, socket, sys print("\nWelcome to Chat Room\n") print("Initialising....\n") time.sleep(1) s = socket.socket() shost = socket.gethostname() ip = socket.gethostbyname(shost) print(shost, "(", ip, ")\n") host = input(str("Enter server address: ")) name = input(str("\nEnter your name: ")) port = 1234 print("\nTrying to connect to ", host, "(", port, ")\n") time.sleep(1) s.connect((host, port)) print("Connected...\n") s.send(name.encode()) s_name = s.recv(1024) s_name = s_name.decode() print(s_name, "has joined the chat room\nEnter [e] to exit chat room\n") while True: message = s.recv(1024) message = message.decode() print(s_name, ":", message) message = input(str("Me : ")) if message == "[e]": message = "Left chat room!" s.send(message.encode()) print("\n") break s.send(message.encode())
راهنمای اجرای کد
در انتهای همین پست آموزش اجرای کد به صورت ویدیویی قرار داده شده است.
۱- اسکریپت server.py و server.py را بر روی صفحه ی اصلی کامپیوتر قرار دهید. (برای راحتی بیشتر این فایل ها را به عنوان مثال بر روی دسکتاپ قرار دادهایم، اما میتوانید در هر مکانی که مایل هستید فایلها را قرار داده و سپس به جای desktop آدرس مورد نظر را وارد کنید.)
۲- عبارت cmd را در قسمت جستجوی ویندوز، وارد کنید و برنامه را باز کنید.
۳- با استفاده از دستور cd، پوشهی جاری را میتوانید تغییر دهید. در اینجا چون فایلها را در دسکتاپ قرار دادیم، پس همان desktop را به عنوان پوشهی جاری وارد میکنیم.
۴- پس از آنکه آدرس محل قرارگیری فایلها را پس از دستور cd وارد کردید؛ دستور py server.py را اجرا کنید. پس از آن کد زبان پایتون، اجرا میشود.
۵- پس از آن یک نام برای سرور وارد کنید و enter را بزنید.
۶- یک cmd دیگر باز کنید و دقیقا مشابه مراحل ۱ تا ۴ عمل کنید با این تفاوت که این بار پس از دستور py، نام client.py را باید وارد کنید.
۷- IP مشخص شده توسط سرور را عینا وارد کنید. سپس یک نام برای کلاینت تخصیص دهید و enter را بزنید تا اتصال برقرار شود.
۸- اکنون میتوانید به ارسال پیام و چت کردن بپردازید.
چندکلام با چ یاب:
در این آموزش سعی کردیم در کوتاهترین و سادهترین حالت ممکن یک برنامهی چت با استفاده از زبان برنامه نویسی پایتون ایجاد کنیم. اگر در مراحل اجرا و یا درک کد برنامه مشکل داشتید، میتوانید در قسمت نظرات با ما در میان بگذارید. همچنین منتظر انتقادات، پیشنهادات و نظرات شما دوستان هستیم.
در ادامه آموزش ویدیویی این مطلب را مشاهده میکنید.
راستی!
جهت اطلاع از آخرین اخبار و آموزشهای ما میتوانید در کانال تلگرام چ یاب عضو شوید.
سلام ممنون از آموزش خوب تون فقط چطوری میشه که فارسی تایپ کنم
نگه داشتن alt و زدن shift⬆️ البته اگه فارسی روی سیستمتون نصبه
سلام
میتونید کمکم کنید که بتونم چیزی درست کنم که با جا های دیگه هم ارتباط کرد
مثلا من تهران باشم یکی دیگه از همین برنامه استفاده کنه و اون یکی مثلا آلمان باشه
و با هم بتونیم ارتباط برقرار کنیم
سلام دوست عزیز، سایر کامنتهای همین پست رو بخونید قبلا به سوالی با این مضمون پاسخ دادیم که میتونه برای شما هم مفید باشه
سلام میشه از راه دور ارتباط برقرار کرد؟مثلا یکی از تهران و یکی از تبریز باهم با این برنامه حرف بزنن
سلام خیر این برنامه ساده هستش و برای اجرا روی یک سیستم و یک شبکه محلی نهایتا، طراحی شده و از طریق اینترنت قابلیت اتصال نداره.
این خط
ا میاد چرا ؟؟؟
وقت بخیر.
مطابق ویدیویی که توی این صفحه گذاشتیم عمل کردید؟
حواستون باشه که اول باید فایل سرور و بعد فایل کلاینت رو اجرا کنید.
من که ایپی رو وارد میکنم بسنه میشه ؟؟
سلام وقت بخیر، ویدیوی آموزش اجرای پروژه رو گذاشتیم توی مطلب، فکر میکنم بتونه بهتون کمک کنه.
اگه بتونید متن ارور رو هم ببینید و بنویسید خوب میشه.
سلام
اگر بخوام این کد رو با دو کلاینت ران کنم
چیکار کنم ؟
یعنی دو تا کلاینت بتونن به سرور وصل بشند
و سرور فقط نقش رابط رو داشته باشه ..
سلام.
باید از multi threading یا همون چند نخی استفاده کنید و هر برنامه رو روی یه ترد اجرا کنید.
توضیحش مفصلتر از یک کامنته و به همین دلیل منبع مناسبی برای اینکار به شما معرفی میکنم.
https://codezup.com/socket-server-with-multiple-clients-model-multithreading-python/
سلام
چرا پیام کلاینت به دستم نمیرسه !
ولی پیام سرور دقیقا سریع به کلاینت منتقل میشه 🙁
سرور فقط میتونه پیام بنویسه برای کلاینت !
یعنی ارتباط یه طرفه هست ! :((
چیکار کنم ؟
سلام وقت بخیر.
نکته ای که در این مورد وجود داره اینه که باید اول سرور آغاز کننده چت باشه!
شاید این مورد رو رعایت نکردید، ویدیو رو حتما ببینید.
سلام
یه بار اجرا زدم به درستی کار کرد
ولی برای قسمتی که پیام های طرف مقابل و نشون میداد میخواستم
مث اون me یه اسم وارد کنم که معلوم باشه این پیام از طرف اون شخصه
الان من کاره خاصی نکردم .. ولی دوباره که ران میکنم به خط ۱۲ فایل سرور
گیر میده میگه اون ادرس رو قبلا استفاده کردی !
چیکار کنم ؟
حتما چک کنید که فایل رو درست کپی کرده باشید و تغییری ایجاد نشده باشه، همچنین نسخه پایتون شما بهتره بالای ۳٫۸ باشه.
اگر همچنان مشکل وجود داشت، ممکنه لینک زیر بتونه به شما کمک کنه:
https://stackoverflow.com/questions/12362542/python-server-only-one-usage-of-each-socket-address-is-normally-permitted
سلام من این آموزش رو مرحله به مرحله نگاه کردم اما حین اجرا دچار مشکل شدم py server.py اجرا نشد یعنی نیورد که خوش آمدید به چت روم می خواستم پشتیبانی فنی تون بهم کمک کنن خواهش می کنم
سلام وقت شما بخیر.
چندتا نکته برای اجرا مهمه:
۱- پایتونی که نصب میکنید نسخه ۳٫۷ به بالا باشه بهتره.
۲- حتما دو cmd جداگانه برای اجرا باز کنید.
۳- اول فایل سرور باید اجرا بشه و بعد فایل کلاینت.
و اینکه ویدیوی انتهای پست رو ببینید و مطابق اون عمل کنید، اگر درست نشد، ارور و خطای برنامه رو اینجا بنویسید.
سلام خسته نباشید.چجوری میشه که اینو به یه وی پی اس وصل کرد و بشه بهش از طریق هر اینترنتی کانکت شد؟
سلام ممنونم از شما:)
لینک زیر به نظرم میتونه برای شما مفید باشه:
(برنامه ای که نوشته شباهت زیادی به کد ما داره)
https://community.ovh.com/en/t/problems-connecting-to-python-socket-on-a-vps-for-a-chat-program/1394
اگه به نتیجه نرسیدید، از لینک زیر هم کمک بگیرید:
https://stackoverflow.com/questions/48158110/send-your-ip-to-vps-through-python3-socket-module
امیدوارم مشکلتون حل شه.
سلام
اگه ما بخوایم ارتباطی رو بین دو کامپیوتر از طریق اینترنت و بدون واسطه ی سایتی برقرار کنیم چه کنیم؟
من به جای socket.gethostname() امدم آی پی اینترنتم رو قرار دادم ولی باز کار نکرد و اخطار داد
حتی پورت رو توی فایروال وارد کردم تا فایروال اون رو در نظر نگیره. ولی مشکل حل نشد!
چه کنم؟
آی پیم رو با کمک این سایت گرفتم : https://whatismyipaddress.com/
ممنون
سلام
اول از همه باید پورت سروری که فایل server رو توش اجرا کردید، port forward کنید.
در ادامه توی فایل کلاینت باید socket.gethostname() رو حذف کنید و به جاش آیپی عمومی سرور رو بذارید.
لینک زیر پورت فوروارد رو توضیح داده:
https://youtu.be/gsNF7trOtU8
امیدوارم مشکلتون حل شه 🙂
خیلی ممنون به خاطر پاسختون.
این تنظیماتی که توی این فیلم گفته شده من ندارم.
مودم من اینا رو نداره
خواهش میکنم.
باز اگه راهکاری پیدا کردم براتون مینویسم.
امیدوارم مشکلتون حل شه 🙂
این برنامه زمانی اجرا میشه که هردو به یک وایفای وصل باشند
برای اینکه از راه دور هم بشه با این برنامه کار کرد راه حلی دارید؟
سلام
بله سوکت برای اتصالات اینترنتی هستش و قابلیت ذخیره سازی پیامها رو نداره و بدون ذخیرهسازی ساخت برنامه چت ممکن نیست.
لازمه که از یک پایگاه داده استفاده بشه و فکر میکنم آموزش زیر بتونه تا حدی کمکتون کنه:
https://getstream.io/blog/realtime-chat-django-angular/
عالی بود ممنون 🌺🌹❤
خواهش میکنم و خوشحالم که این آموزش مورد توجه شما قرار گرفته.
همچنین به شما دوست عزیز پیشنهاد میکنم حتما آزمونهای تخصصی پایتون ما رو امتحان کنید.
سلام دوباره ببخشید میگم که حالا یه مشکل دیگه اینه که وقتی مثلا من دارم تایپ میکنم و کلاینت یک پیام میفرسته من دوباره باید از اول پیامم رو بنویسم راهی برای این مشکل دارید؟
سلام طبق کد بالا چون از یک سوکت استفاده میکنیم، در آن واحد فقط یک سمت قابلیت نوشتن داره.
اما این برنامه توی لینک زیر با استفاده از thread نوشته شده و طبیعتا حالت دریافت و ارسال همزمان پیام رو داره.
https://blog.furas.pl/python-socket-send-and-receive-at-the-same-time-gb.html
من کد سرور رو اجرا میکنم و همون وقت هم کد کلاینت رو ولی این اروور رو میده
http://s13.picofile.com/file/8401619926/da.png
بله درست میگید کدش ایراد داشت.
لینک زیر هم شاید بتونه مفید باشه:
https://codereview.stackexchange.com/questions/188462/udp-chat-program-with-server-client-and-listener
با این تفاوت که برنامه ی خواندن پیام از فرستادن پیام جدا هست ولی به صورت همزمان و چندکاربره قابل استفاده هستش.
فکر میکنم اگر روی کد کار کنید بتونید ترکیب کنید.
موفق باشید.
سلام خیلی خیلی ممنونم فقط یه سوال چگونه میتوانم یک رابط گرافیکی براش بسازم فک کنم اگه اینکار رو کنم ای مشکل نخواهد بود
سلام مجدد خدمت شما
بله درست میگید شاید اینطوری بهتر باشه.
متاسفانه در حال حاضر توی سایت خودمون آموزش پایتون گرافیکی نداریم.
ولی ویدیوی زیر حتما میتونه کمکتون کنه.
موفق باشید.
https://www.youtube.com/watch?v=VMbk_7jkS_4
خیلی ممنونم از زحماتتون
خواهش میکنم در خدمتیم.
منظورم فارسیه بهم چسبیده اس
mersiiiiiiiiiiiiii dorost shod faghat ye soal dige daram ghol midam akhary bashe barname basesh cmd e mishe toosh v farsi ro ghabool nmikone chejoori mitoonm farsi toosh benevisam aslan emkan dare????
راجع به این موضوع مطمئن نیستم ولی تا جایی که میدونم محیط خود idle پایتون و برنامه ای مثل vs code چنین مشکلی رو ندارن و میشه فارسی نوشت.
توصیه میکنم vs code رو تست کنید اول و اینکه یک مقدار کار با جملات فارسی احتمالا سخت خواهد بود.
اختیار دارید در خدمتیم
https://stackoverflow.com/questions/62394557/python-lan-messenger-notification
اینم کد من
با سلام اقا من یه سوالی دارم این کد رو من تغییر دادم و الان میخوام وقتی یک نفر پیامی رو فرستاد یک صدای نوتیفیکیشن پلی بشه لطفا راهنمایی کنید
لطفا کد را در سایت استک اوور فلو بخونید و راهنمایی کنید
سلام
راهکاری که دارم این هستش که شما از لینک زیر تابع پخش صوت رو انتخاب کنید.
https://pythonbasics.org/python-play-sound
و تابع رو قبل از خط زیر در کد کلاینت
و همچنین قبل از خط زیر در کد سرور قرار بدید.
فقط یه چیزی ببخشید میشه بگید چه کدی بنویسم پشتش خود کد رو میگم نه توضیحش با تشکر
راستی پیشنهاد میکنم که حتما توی آزمون های پایتون ما شرکت کنید 🙂
نوار بالای همین صفحه بخش چکاپ ، آزمون برنامه نویسی
خیلییییییییییییییییییییییییییییییییییی ازتون ممننننووووووووووووونمممم
خواهش میکنم
عالی
متشکرم از توجه شما 🙂
میگم مشکلو فقط برای خنده تو فایل کلاینت اشتباهی کد سرور رو کپی کرده بودم ممنون از رسیدگی خیلی خیلی سریع
خواهش میکنم 🙂
باز خوبه زود متوجه شدین و درستش کردین
ممنون ببخشید خودم حلش کردم
چقدر خوب که تونستید حلش کنید
اگه مایل بودید روش حل مشکل رو برای ما بنویسید
شاید این مشکل برای بقیه هم پیش بیاد
سلام برای من این اررور را نمایش میدع
Traceback (most recent call last):
File “client.py”, line 12, in <module>
s.bind((host, port))
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
دقیقا منم بار دوم که اومدم اجرا بزنم از اول این ارور رو داد
رقیقا به خط ۱۲ گیر میده -_-
مشکل ایشون، اشتباه کپی کردن کد سرور توی فایل کلاینت بود.
عالی بود
خوشحالم که مورد استقبال شما قرار گرفته است.
همچنین به شما توصیه میکنم دوره ی آموزشی پایتون را مطالعه کنید.
ارشیا عزیز تشکر از نظرت
سایر مقالات ما رو از دست ندید…