Hướng dẫn how do you code a chat in python? - làm thế nào để bạn viết mã một cuộc trò chuyện trong python?

& nbsp; · 8 phút Đọc · Cập nhật tháng 7 năm 2022 · Thư viện tiêu chuẩn Python · 8 min read · Updated jul 2022 · Python Standard Library

Tiết lộ: Bài đăng này có thể chứa các liên kết liên kết, có nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi nhận được hoa hồng.: This post may contain affiliate links, meaning when you click the links and make a purchase, we receive a commission.

Phòng trò chuyện là một giao diện cho phép hai hoặc nhiều người trò chuyện và gửi tin nhắn cho mọi người trong phòng. Trong hướng dẫn này, bạn sẽ học cách xây dựng một máy chủ phòng trò chuyện đơn giản và cho phép nhiều máy khách kết nối với nó bằng ổ cắm trong Python.In this tutorial, you will learn how to build a simple chat room server and allow multiple clients to connect to it using sockets in Python.

Chúng tôi sẽ sử dụng mô-đun ổ cắm được tích hợp sẵn với Python và cung cấp cho chúng tôi các hoạt động ổ cắm được sử dụng rộng rãi trên Internet, vì chúng đứng sau bất kỳ kết nối nào với bất kỳ mạng nào.

Để bắt đầu và để thay đổi màu văn bản, chúng ta sẽ cần gói Colorama để gán màu in cho mỗi máy khách trong phòng chat:colorama package to assign a printing color to each client in the chatroom:

pip3 install colorama

Vì chúng tôi đang sử dụng ổ cắm, nên chúng tôi cần một máy chủ và mã máy khách, hãy bắt đầu với phía máy chủ.

Mã máy chủ

Trong kiến ​​trúc của chúng tôi, toàn bộ công việc của máy chủ là thực hiện hai hoạt động thiết yếu:

  • Lắng nghe các kết nối khách hàng sắp tới, nếu một máy khách mới được kết nối, chúng tôi sẽ thêm nó vào bộ sưu tập ổ cắm máy khách của chúng tôi.
  • Bắt đầu một luồng mới cho mỗi máy khách được kết nối tiếp tục nghe các tin nhắn sắp tới được gửi từ máy khách và phát nó cho tất cả các máy khách khác.

Mã dưới đây tạo ra ổ cắm TCP và liên kết nó với địa chỉ máy chủ, sau đó lắng nghe các kết nối sắp tới:

import socket
from threading import Thread

# server's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5002 # port we want to use
separator_token = "" # we will use this to separate the client name & message

# initialize list/set of all connected client's sockets
client_sockets = set()
# create a TCP socket
s = socket.socket()
# make the port as reusable port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# bind the socket to the address we specified
s.bind((SERVER_HOST, SERVER_PORT))
# listen for upcoming connections
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")

Lưu ý rằng tôi đã sử dụng "0.0.0.0" làm địa chỉ IP máy chủ. Điều này có nghĩa là tất cả các địa chỉ IPv4 trên máy cục bộ. Bạn có thể tự hỏi, tại sao chúng ta không chỉ sử dụng localhost hoặc "127.0.0.1"? Chà, nếu máy chủ có hai địa chỉ IP, hãy nói "192.168.1.2" trên mạng và "10.0.0.1" trên một mạng khác, thì máy chủ lắng nghe trên cả hai mạng."0.0.0.0" as the server IP address. this means all IPv4 addresses on the local machine. You may wonder, why we don't just use localhost or "127.0.0.1" ? Well, if the server has two IP addresses, let's say "192.168.1.2" on a network and "10.0.0.1" on another, then the server listens on both networks.

Chúng tôi chưa chấp nhận kết nối, vì chúng tôi không gọi phương thức accept(), mã dưới đây hoàn thành công thức mã máy chủ:

def listen_for_client(cs):
    """
    This function keep listening for a message from `cs` socket
    Whenever a message is received, broadcast it to all other connected clients
    """
    while True:
        try:
            # keep listening for a message from `cs` socket
            msg = cs.recv(1024).decode()
        except Exception as e:
            # client no longer connected
            # remove it from the set
            print(f"[!] Error: {e}")
            client_sockets.remove(cs)
        else:
            # if we received a message, replace the  
            # token with ": " for nice printing
            msg = msg.replace(separator_token, ": ")
        # iterate over all connected sockets
        for client_socket in client_sockets:
            # and send the message
            client_socket.send(msg.encode())

while True:
    # we keep listening for new connections all the time
    client_socket, client_address = s.accept()
    print(f"[+] {client_address} connected.")
    # add the new connected client to connected sockets
    client_sockets.add(client_socket)
    # start a new thread that listens for each client's messages
    t = Thread(target=listen_for_client, args=(client_socket,))
    # make the thread daemon so it ends whenever the main thread ends
    t.daemon = True
    # start the thread
    t.start()

Như đã đề cập trước đây, chúng tôi thêm ổ cắm máy khách được kết nối vào bộ sưu tập ổ cắm của chúng tôi và sau đó chúng tôi bắt đầu một luồng mới và chúng tôi đặt nó thành một luồng daemon (kiểm tra hướng dẫn này để biết thêm thông tin về các luồng daemon) thực thi chức năng listen_for_client() đã xác định của chúng tôi, trong đó cung cấp một ổ cắm của máy khách, nó chờ một tin nhắn được gửi bằng phương thức

import socket
from threading import Thread

# server's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5002 # port we want to use
separator_token = "" # we will use this to separate the client name & message

# initialize list/set of all connected client's sockets
client_sockets = set()
# create a TCP socket
s = socket.socket()
# make the port as reusable port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# bind the socket to the address we specified
s.bind((SERVER_HOST, SERVER_PORT))
# listen for upcoming connections
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")
0, nếu vậy, thì nó sẽ gửi nó cho tất cả các máy khách được kết nối khác.

Cuối cùng, hãy đóng tất cả các ổ cắm:

# close client sockets
for cs in client_sockets:
    cs.close()
# close server socket
s.close()

Được rồi, đó là mã máy chủ, hãy đi sâu vào mã máy khách.

Mã khách hàng

Khách hàng thực hiện ba hoạt động cơ bản:

  • Kết nối với máy chủ.
  • Tiếp tục nghe tin nhắn đến từ máy chủ (phải là máy khách đã gửi tin nhắn đến máy chủ và máy chủ đã phát nó) và in nó vào bảng điều khiển.
  • Đang chờ người dùng nhập tin nhắn để gửi đến máy chủ.

Đây là mã cho hoạt động đầu tiên:

import socket
import random
from threading import Thread
from datetime import datetime
from colorama import Fore, init, Back

# init colors
init()

# set the available colors
colors = [Fore.BLUE, Fore.CYAN, Fore.GREEN, Fore.LIGHTBLACK_EX, 
    Fore.LIGHTBLUE_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTGREEN_EX, 
    Fore.LIGHTMAGENTA_EX, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX, 
    Fore.LIGHTYELLOW_EX, Fore.MAGENTA, Fore.RED, Fore.WHITE, Fore.YELLOW
]

# choose a random color for the client
client_color = random.choice(colors)

# server's IP address
# if the server is not on this machine, 
# put the private (network) IP address (e.g 192.168.1.2)
SERVER_HOST = "127.0.0.1"
SERVER_PORT = 5002 # server's port
separator_token = "" # we will use this to separate the client name & message

# initialize TCP socket
s = socket.socket()
print(f"[*] Connecting to {SERVER_HOST}:{SERVER_PORT}...")
# connect to the server
s.connect((SERVER_HOST, SERVER_PORT))
print("[+] Connected.")

Là một hoạt động phụ, chúng tôi cũng đặt một màu cho mỗi máy khách, bạn sẽ thấy nó ở đầu ra. Ngoài ra, hãy đặt tên cho từng máy khách, vì vậy chúng tôi có thể phân biệt giữa các máy khách:

# prompt the client for a name
name = input("Enter your name: ")

Mã dưới đây chịu trách nhiệm cho hoạt động thứ hai; Tiếp tục nghe tin nhắn từ máy chủ và in chúng vào bảng điều khiển:

def listen_for_messages():
    while True:
        message = s.recv(1024).decode()
        print("\n" + message)

# make a thread that listens for messages to this client & print them
t = Thread(target=listen_for_messages)
# make the thread daemon so it ends whenever the main thread ends
t.daemon = True
# start the thread
t.start()

Chúng tôi cũng muốn nó nằm trong một luồng riêng như một luồng daemon, vì vậy chúng tôi có thể làm những việc khác trong khi nghe tin nhắn.

Bây giờ chúng ta hãy thực hiện nhiệm vụ cuối cùng; Đang chờ đầu vào người dùng cho tin nhắn, sau đó gửi chúng đến máy chủ:

while True:
    # input message we want to send to the server
    to_send =  input()
    # a way to exit the program
    if to_send.lower() == 'q':
        break
    # add the datetime, name & the color of the sender
    date_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
    to_send = f"{client_color}[{date_now}] {name}{separator_token}{to_send}{Fore.RESET}"
    # finally, send the message
    s.send(to_send.encode())

# close the socket
s.close()

Chúng tôi thêm màu khách hàng, tên và thời gian hiện tại vào thông báo sẽ được gửi, chúng tôi gửi tin nhắn bằng phương thức thông điệp.

Trình diễn

Được rồi, bây giờ chúng tôi đã hoàn thành cả hai công thức nấu ăn, hãy trình diễn. Đầu tiên, chúng ta hãy chạy một và chỉ một phiên bản máy chủ:

Hướng dẫn how do you code a chat in python? - làm thế nào để bạn viết mã một cuộc trò chuyện trong python?

Tuyệt vời, máy chủ đang lắng nghe các kết nối khách hàng sắp tới, chúng ta hãy cố gắng chạy một phiên bản khách hàng:

Bây giờ máy khách được kết nối với máy chủ và được nhắc tên người dùng, để đảm bảo rằng nó được kết nối, hãy quay lại bảng điều khiển máy chủ và bạn sẽ thấy nó thực sự được kết nối:

Lưu ý rằng chúng tôi đang ở địa chỉ localhost (127.0.0.1) ngay bây giờ, vì đó là cùng một máy, nhưng nếu bạn muốn kết nối từ các máy khác trong cùng một mạng, bạn cũng có thể làm điều đó, chỉ cần đảm bảo thay đổi

import socket
from threading import Thread

# server's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5002 # port we want to use
separator_token = "" # we will use this to separate the client name & message

# initialize list/set of all connected client's sockets
client_sockets = set()
# create a TCP socket
s = socket.socket()
# make the port as reusable port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# bind the socket to the address we specified
s.bind((SERVER_HOST, SERVER_PORT))
# listen for upcoming connections
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")
3 trong máy khách Mã từ 127.0.0.1 đến địa chỉ IP riêng của máy chủ.127.0.0.1) address for now, as it's the same machine, but if you want to connect from other machines in the same network, you can do that as well, just make sure to change
import socket
from threading import Thread

# server's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5002 # port we want to use
separator_token = "" # we will use this to separate the client name & message

# initialize list/set of all connected client's sockets
client_sockets = set()
# create a TCP socket
s = socket.socket()
# make the port as reusable port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# bind the socket to the address we specified
s.bind((SERVER_HOST, SERVER_PORT))
# listen for upcoming connections
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")
3 in client code from 127.0.0.1 to the server's private IP address.

Hãy chạy một khách hàng khác để chúng ta có thể trò chuyện:

Thật tuyệt vời, như bạn có thể thấy, mỗi máy khách có màu để chúng tôi có thể phân biệt giữa người dùng, hãy chạy một ứng dụng khách thứ ba cho vui:

Sự kết luận

Tuyệt vời, bây giờ mọi tin nhắn được gửi từ một khách hàng cụ thể đều được gửi đến tất cả các máy khách khác. Lưu ý các màu được thay đổi bất cứ khi nào bạn thực hiện lại tập lệnh Client.py.Note the colors are changed whenever you re-execute the client.py script.

Vui lòng kiểm tra mã đầy đủ để bạn có thể dễ dàng tự chạy chúng!

Tôi khuyến khích bạn thêm nhiều tính năng vào chương trình này. Ví dụ: bạn có thể đưa ra thông báo cho tất cả người dùng khi khách hàng mới được kết nối!

Để biết thêm hướng dẫn Python ổ cắm, hãy kiểm tra sau đây:

  • Cách chuyển các tệp trong mạng bằng ổ cắm trong Python.
  • Làm thế nào để tạo một vỏ ngược trong Python.

Cuối cùng, nếu bạn là người mới bắt đầu và muốn học Python, tôi khuyên bạn nên tham gia khóa học & nbsp; Python cho mọi người Coursera, trong đó bạn sẽ tìm hiểu rất nhiều về Python. Bạn cũng có thể kiểm tra trang & NBSP; Tài nguyên và khóa học của chúng tôi & nbsp; để xem tài nguyên Python tôi đề xuất!

Tìm hiểu thêm: Ghi nhật ký vào Python. Logging in Python.

Happy Coding ♥

Xem đầy đủ mã


Cũng đọc


Hướng dẫn how do you code a chat in python? - làm thế nào để bạn viết mã một cuộc trò chuyện trong python?

Hướng dẫn how do you code a chat in python? - làm thế nào để bạn viết mã một cuộc trò chuyện trong python?


Bảng bình luận

Trò chuyện GUI là gì?

Đầu ra: Ví dụ 2: Đây là ứng dụng trò chuyện GUI đơn giản (giao diện người dùng đồ họa) trong đó nhiều người dùng có thể kết nối với nhau trong kiến trúc máy khách-máy chủ, tức là máy khách sẽ tương tác với sự trợ giúp của máy chủ.Graphical User Interface) chat application where multiple users can connect with each other in a client-server architecture i.e the clients will interact with the help of the server.

Python lập trình ổ cắm là gì?

Ổ cắm và API ổ cắm được sử dụng để gửi tin nhắn trên mạng.Họ cung cấp một hình thức giao tiếp giữa các quá trình (IPC).Mạng có thể là một mạng cục bộ, hợp lý với máy tính hoặc một mạng được kết nối về mặt vật lý với mạng bên ngoài, với các kết nối riêng với các mạng khác.used to send messages across a network. They provide a form of inter-process communication (IPC). The network can be a logical, local network to the computer, or one that's physically connected to an external network, with its own connections to other networks.