آموزش زبان برنامه نویسی پایتون cheyab.ir

آموزش برنامه چت ساده با پایتون + کد و ویدیوی اجرای برنامه

در این آموزش از سری آموزش زبان برنامه نویسی پایتون در سایت چ یاب قصد داریم به بررسی یک پروژه بپردازیم. پروژه ی چت ساده با استفاده از برنامه نویسی سوکت! تا انتهای پست همراه ما باشید… همچنین در آخر می‌توانید ویدیوی آموزش اجرای این پروژه را ببینید.

بله در ادامه یاد می‌گیرید که به راحتی یک برنامه برای ایجاد ارتباط بین یک سرور و کلاینت ایجاد کنید و محیطی برای چت بین دو طرف فراهم آورید. اگر به دنبال آموزش زبان برنامه نویسی پایتون رایگان می‌گردید؛ می‌توانید به “محبوب مثل پایتون!” مراجعه کنید. این پست مقدمه‌ای مناسب بر زبان پایتون است.

در زبان برنامه نویسی پایتون، سوکت یا 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 را اجرا کنید. پس از آن کد زبان پایتون، اجرا می‌شود.

چـت ساده در پایـتون cheyab.ir

۵- پس از آن یک نام برای سرور وارد کنید و enter را بزنید.

سوکت در پایتون cheyab.ir

۶- یک  cmd دیگر باز کنید و دقیقا مشابه مراحل ۱ تا ۴ عمل کنید با این تفاوت که این بار پس از دستور py، نام  client.py را باید وارد کنید.

۷- IP مشخص شده توسط سرور را عینا وارد کنید. سپس یک نام برای کلاینت تخصیص دهید و enter را بزنید تا اتصال برقرار شود.

آموزش زبان برتامه نویسی پایتون رایگان cheyab.ir

۸- اکنون می‌توانید به ارسال پیام و چت کردن بپردازید.

آموزش پایتون از مبتدی تا حرفه ای cheyab.ir

چندکلام با چ یاب:

در این آموزش سعی کردیم در کوتاه‌ترین و ساده‌ترین حالت ممکن یک برنامه‌ی چت با استفاده از زبان برنامه نویسی پایتون ایجاد کنیم. اگر در مراحل اجرا و یا درک کد برنامه مشکل داشتید، می‌توانید در قسمت نظرات با ما در میان بگذارید. همچنین منتظر انتقادات، پیشنهادات و نظرات شما دوستان هستیم.

در ادامه آموزش ویدیویی این مطلب را مشاهده می‌کنید.

راستی!

جهت اطلاع از آخرین اخبار و آموزش‌های ما می‌توانید در کانال تلگرام چ یاب عضو شوید.

59 در مورد “آموزش برنامه چت ساده با پایتون + کد و ویدیوی اجرای برنامه”

  1. سلام ممنون از آموزش خوب تون فقط چطوری میشه که فارسی تایپ کنم

    1. نگه داشتن alt و زدن shift⬆️ البته اگه فارسی روی سیستمتون نصبه

  2. ناشناس

    سلام
    میتونید کمکم کنید که بتونم چیزی درست کنم که با جا های دیگه هم ارتباط کرد
    مثلا من تهران باشم یکی دیگه از همین برنامه استفاده کنه و اون یکی مثلا آلمان باشه
    و با هم بتونیم ارتباط برقرار کنیم

    1. فروغ رحیمی

      سلام دوست عزیز، سایر کامنت‌های همین پست رو بخونید قبلا به سوالی با این مضمون پاسخ دادیم که میتونه برای شما هم مفید باشه

  3. سلام میشه از راه دور ارتباط برقرار کرد؟مثلا یکی از تهران و یکی از تبریز باهم با این برنامه حرف بزنن

    1. فروغ رحیمی

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

  4. gaierror                                  Traceback (most recent call last)
    <ipython-input-6-95d4f3dce485> in <module>
         ۱۵ print("\nTrying to connect to ", host, "(", port, ")\n")
         ۱۶ time.sleep(1)
    ---> 17 s.connect((host, port))
         ۱۸ print("Connected...\n")
         ۱۹ 
    
    gaierror: [Errno 11001] getaddrinfo failed
    

    این خط
    ا میاد چرا ؟؟؟

    1. فروغ رحیمی

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

    1. فروغ رحیمی

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

  5. سلام
    اگر بخوام این کد رو با دو کلاینت ران کنم
    چیکار کنم ؟
    یعنی دو تا کلاینت بتونن به سرور وصل بشند
    و سرور فقط نقش رابط رو داشته باشه ..

  6. سلام
    چرا پیام کلاینت به دستم نمیرسه !
    ولی پیام سرور دقیقا سریع به کلاینت منتقل میشه 🙁
    سرور فقط میتونه پیام بنویسه برای کلاینت !
    یعنی ارتباط یه طرفه هست ! :((
    چیکار کنم ؟

    1. فروغ رحیمی

      سلام وقت بخیر.

      نکته ای که در این مورد وجود داره اینه که باید اول سرور آغاز کننده چت باشه!

      شاید این مورد رو رعایت نکردید، ویدیو رو حتما ببینید.

  7. سلام
    یه بار اجرا زدم به درستی کار کرد
    ولی برای قسمتی که پیام های طرف مقابل و نشون میداد میخواستم
    مث اون me یه اسم وارد کنم که معلوم باشه این پیام از طرف اون شخصه
    الان من کاره خاصی نکردم .. ولی دوباره که ران میکنم به خط ۱۲ فایل سرور
    گیر میده میگه اون ادرس رو قبلا استفاده کردی !
    چیکار کنم ؟

  8. فاطمه اسدی

    سلام من این آموزش رو مرحله به مرحله نگاه کردم اما حین اجرا دچار مشکل شدم py server.py اجرا نشد یعنی نیورد که خوش آمدید به چت روم می خواستم پشتیبانی فنی تون بهم کمک کنن خواهش می کنم

    1. فروغ رحیمی

      سلام وقت شما بخیر.
      چندتا نکته برای اجرا مهمه:
      ۱- پایتونی که نصب میکنید نسخه ۳٫۷ به بالا باشه بهتره.
      ۲- حتما دو cmd جداگانه برای اجرا باز کنید.
      ۳- اول فایل سرور باید اجرا بشه و بعد فایل کلاینت.

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

  9. سلام خسته نباشید.چجوری میشه که اینو به یه وی پی اس وصل کرد و بشه بهش از طریق هر اینترنتی کانکت شد؟

    1. فروغ رحیمی

      سلام ممنونم از شما:)
      لینک زیر به نظرم میتونه برای شما مفید باشه:
      (برنامه ای که نوشته شباهت زیادی به کد ما داره)
      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

      امیدوارم مشکلتون حل شه.

  10. سلام
    اگه ما بخوایم ارتباطی رو بین دو کامپیوتر از طریق اینترنت و بدون واسطه ی سایتی برقرار کنیم چه کنیم؟
    من به جای socket.gethostname() امدم آی پی اینترنتم رو قرار دادم ولی باز کار نکرد و اخطار داد
    حتی پورت رو توی فایروال وارد کردم تا فایروال اون رو در نظر نگیره. ولی مشکل حل نشد!
    چه کنم؟
    آی پیم رو با کمک این سایت گرفتم : https://whatismyipaddress.com/
    ممنون

    1. فروغ رحیمی

      سلام
      اول از همه باید پورت سروری که فایل server رو توش اجرا کردید، port forward کنید.
      در ادامه توی فایل کلاینت باید socket.gethostname() رو حذف کنید و به جاش آیپی عمومی سرور رو بذارید.
      لینک زیر پورت فوروارد رو توضیح داده:
      https://youtu.be/gsNF7trOtU8

      امیدوارم مشکلتون حل شه 🙂

    2. خیلی ممنون به خاطر پاسختون.
      این تنظیماتی که توی این فیلم گفته شده من ندارم.
      مودم من اینا رو نداره

    3. فروغ رحیمی

      خواهش میکنم.
      باز اگه راهکاری پیدا کردم براتون می‌نویسم.
      امیدوارم مشکلتون حل شه 🙂

  11. امیر محمد

    این برنامه زمانی اجرا میشه که هردو به یک وایفای وصل باشند
    برای اینکه از راه دور هم بشه با این برنامه کار کرد راه حلی دارید؟

    1. فروغ رحیمی

      سلام
      بله سوکت برای اتصالات اینترنتی هستش و قابلیت ذخیره سازی پیام‌ها رو نداره و بدون ذخیره‌سازی ساخت برنامه چت ممکن نیست.
      لازمه که از یک پایگاه داده استفاده بشه و فکر میکنم آموزش زیر بتونه تا حدی کمکتون کنه:

      https://getstream.io/blog/realtime-chat-django-angular/

    1. فروغ رحیمی

      خواهش میکنم و خوشحالم که این آموزش مورد توجه شما قرار گرفته.

      همچنین به شما دوست عزیز پیشنهاد میکنم حتما آزمون‌های تخصصی پایتون ما رو امتحان کنید.

  12. سلام دوباره ببخشید میگم که حالا یه مشکل دیگه اینه که وقتی مثلا من دارم تایپ میکنم و کلاینت یک پیام میفرسته من دوباره باید از اول پیامم رو بنویسم راهی برای این مشکل دارید؟

    1. فروغ رحیمی

      بله درست میگید کدش ایراد داشت.
      لینک زیر هم شاید بتونه مفید باشه:
      https://codereview.stackexchange.com/questions/188462/udp-chat-program-with-server-client-and-listener

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

    2. سلام خیلی خیلی ممنونم فقط یه سوال چگونه میتوانم یک رابط گرافیکی براش بسازم فک کنم اگه اینکار رو کنم ای مشکل نخواهد بود

    3. فروغ رحیمی

      سلام مجدد خدمت شما
      بله درست میگید شاید اینطوری بهتر باشه.
      متاسفانه در حال حاضر توی سایت خودمون آموزش پایتون گرافیکی نداریم.
      ولی ویدیوی زیر حتما میتونه کمکتون کنه.
      موفق باشید.

      https://www.youtube.com/watch?v=VMbk_7jkS_4

  13. 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????
     
     

    1. فروغ رحیمی

      راجع به این موضوع مطمئن نیستم ولی تا جایی که میدونم محیط خود idle پایتون و برنامه ای مثل vs code چنین مشکلی رو ندارن و میشه فارسی نوشت.
      توصیه میکنم vs code رو تست کنید اول و اینکه یک مقدار کار با جملات فارسی احتمالا سخت خواهد بود.

  14. با سلام اقا من یه سوالی دارم این کد رو من تغییر دادم و الان میخوام وقتی یک نفر پیامی رو فرستاد یک صدای نوتیفیکیشن پلی بشه لطفا راهنمایی کنید
     
    لطفا کد را در سایت استک اوور فلو بخونید و راهنمایی کنید
     

    1. فروغ رحیمی

      سلام

       

      راهکاری که دارم این هستش که شما از لینک زیر تابع پخش صوت رو انتخاب کنید.

       

      https://pythonbasics.org/python-play-sound

       
       

      و تابع رو قبل از خط زیر در کد کلاینت

       

      print('Server: ' + data)
      

      و همچنین قبل از خط زیر در کد سرور قرار بدید.

       

      print('Client: ' + message)
      

       

    2. فقط یه چیزی ببخشید میشه بگید چه کدی بنویسم پشتش خود کد رو میگم نه توضیحش با تشکر

    3. فروغ رحیمی

      راستی پیشنهاد میکنم که حتما توی آزمون های پایتون ما شرکت کنید 🙂
      نوار بالای همین صفحه بخش چکاپ ، آزمون برنامه نویسی

    4. خیلییییییییییییییییییییییییییییییییییی ازتون ممننننووووووووووووونمممم
       

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

    1. فروغ رحیمی

      خواهش میکنم 🙂
      باز خوبه زود متوجه شدین و درستش کردین

    1. فروغ رحیمی

      چقدر خوب که تونستید حلش کنید
      اگه مایل بودید روش حل مشکل رو برای ما بنویسید
      شاید این مشکل برای بقیه هم پیش بیاد

  16. سلام برای من این اررور را نمایش میدع
     
    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

    1. دقیقا منم بار دوم که اومدم اجرا بزنم از اول این ارور رو داد
      رقیقا به خط ۱۲ گیر میده -_-

    2. فروغ رحیمی

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

    1. محمد مهدی عسگری

      ارشیا عزیز تشکر از نظرت
      سایر مقالات ما رو از دست ندید…

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

سبد خرید
Scroll to Top