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

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

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

چت ساده پایتون
چت ساده پایتون

در زبان برنامه نویسی پایتون، سوکت یا 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(&quot\nWelcome to Chat Room\n&quot)
print(&quotInitialising....\n&quot)
time.sleep(1)

s = socket.socket()
host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 1234
s.bind((host, port))
print(host, &quot(&quot, ip, &quot)\n&quot)
name = input(str(&quotEnter your name: &quot))
s.listen(1)
print(&quot\nWaiting for incoming connections...\n&quot)
conn, addr = s.accept()
print(&quotReceived connection from &quot, addr[0], &quot(&quot, addr[1], &quot)\n&quot)

s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, &quothas connected to the chat room\nEnter [e] to exit chat room\n&quot)
conn.send(name.encode())

while True:
    message = input(str(&quotMe : &quot))
    if message == &quot[e]&quot:
        message = &quotLeft chat room!&quot
        conn.send(message.encode())
        print(&quot\n&quot)
        break
    conn.send(message.encode())
    message = conn.recv(1024)
    message = message.decode()
    print(s_name, &quot:&quot, message) 

اسکریپت کلاینت (client):

کد مربوط به کلاینت نیز مانند کد سرور، یک توالی از توابع دارد. توابعی همچون socket و connect که برای ارتباط با سرور مورد استفاده قرار می‌گیرند. در ادامه نیز توضیحات کوتاهی در مورد این دوتابع آورده ایم:

  • socket: یک ارتباط سوکت با استفاده از آدرس، نوع سوکت و پروتکل ایجاد می‌کند.
  • connect: به سرور سوکت در آدرس مشخص، متصل می‌شود.

کد کلاینت:

# client.py
import time, socket, sys
print(&quot\nWelcome to Chat Room\n&quot)
print(&quotInitialising....\n&quot)
time.sleep(1)

s = socket.socket()
shost = socket.gethostname()
ip = socket.gethostbyname(shost)
print(shost, &quot(&quot, ip, &quot)\n&quot)
host = input(str(&quotEnter server address: &quot))
name = input(str(&quot\nEnter your name: &quot))
port = 1234
print(&quot\nTrying to connect to &quot, host, &quot(&quot, port, &quot)\n&quot)
time.sleep(1)
s.connect((host, port))
print(&quotConnected...\n&quot)

s.send(name.encode())
s_name = s.recv(1024)
s_name = s_name.decode()
print(s_name, &quothas joined the chat room\nEnter [e] to exit chat room\n&quot)

while True:
     message = s.recv(1024)
     message = message.decode()
     print(s_name, &quot:&quot, message)
     message = input(str(&quotMe : &quot))
     if message == &quot[e]&quot:
         message = &quotLeft chat room!&quot
         s.send(message.encode())
         print(&quot\n&quot)
         break
     s.send(message.encode())                   

اگر نکته، سوال و یا مطلبی مدنظرتان است، در قسمت نظرات به اشتراک بگذارید.