Chương trình chat client - server python

Bài viết này mình muốn hướng dẫn các bạn tạo một ứng dụng chat socket trong python đơn giản với mô hình client – server. Trước khi làm bạn cần tìm hiểu qua để biết socket là gì nhé. Trên mạng giờ giải thích chi tiết rất nhiều đó. Còn mô hình Client – Server hay còn gọi là mô hình máy chủ – máy khách, máy chịu trách nhiệm xử lý yêu cầu và trả kết quả về máy khách.

mô hình client – server

Mục Lục

  • 1 Tạo ứng dụng Chat Socket trong Python
    • 1.1 Tạo server bằng socket
    • 1.2 Tạo client kết nối tới server
  • 2 Chạy chương trình

Tạo ứng dụng Chat Socket trong Python

Ở đây mình sẽ sử dụng pycham để code và python 3, đầu tiên mình sẽ tạo mới 1 project tên là ChatSocketInPython.

Chat Socket Trong Python

Tiếp đó sẽ tạo 3 file là server.py để xử lý dữ liệu và điều hướng Client, Client.py client 2.py

Ứng Dụng Chat Nội Bộ

Tạo server bằng socket

#!/usr/bin/env python3
"""Server for multithreaded [asynchronous] chat application."""
from socket import AF_INET, socket, SOCK_STREAM
from threading import Thread


def accept_incoming_connections[]:
    while True:
        client, client_address = SERVER.accept[]
        print["%s:%s has connected." % client_address]
        client.send[bytes["Nhập tên của bạn rồi bắt đầu chat!", "utf8"]]
        addresses[client] = client_address
        Thread[target=handle_client, args=[client,]].start[]


def handle_client[client]:  # Takes client socket as argument.
    name = client.recv[BUFSIZ].decode["utf8"]
    welcome = 'Xin chào %s! Nếu bạn muốn thoát gõ, {quit} để thoát.' % name
    client.send[bytes[welcome, "utf8"]]
    msg = "%s đã tham gia phòng chat!" % name
    broadcast[bytes[msg, "utf8"]]
    clients[client] = name

    while True:
        msg = client.recv[BUFSIZ]
        if msg != bytes["{quit}", "utf8"]:
            broadcast[msg, name + ": "]
        else:
            client.send[bytes["{quit}", "utf8"]]
            client.close[]
            del clients[client]
            broadcast[bytes["%s đã thoát phòng chat." % name, "utf8"]]
            break


def broadcast[msg, prefix=""]:  # prefix is for name identification.
    for sock in clients:
        sock.send[bytes[prefix, "utf8"] + msg]


clients = {}
addresses = {}

HOST = '127.0.0.1'
PORT = 33000
BUFSIZ = 1024
ADDR = [HOST, PORT]

SERVER = socket[AF_INET, SOCK_STREAM]
SERVER.bind[ADDR]

if __name__ == "__main__":
    SERVER.listen[5]
    print["Chờ kết nối từ các client..."]
    ACCEPT_THREAD = Thread[target=accept_incoming_connections]
    ACCEPT_THREAD.start[]
    ACCEPT_THREAD.join[]
    SERVER.close[]

Tạo client kết nối tới server

Tại client chúng ta sẽ tạo giao diện bằng thư viện tkinter và các hàm sử lý cho dữ liệu, cách kết nối đến server từ client. Đoạn code sau sẽ áp dụng cho file Client.pyclient2.py hoặc nhiều hơn.


from socket import AF_INET, socket, SOCK_STREAM
from threading import Thread
import tkinter


def receive[]:
    while True:
        try:
            msg = client_socket.recv[BUFSIZ].decode["utf8"]
            msg_list.insert[tkinter.END, msg]
        except OSError:  # Possibly client has left the chat.
            break


def send[event=None]:  # event is passed by binders.
    msg = my_msg.get[]
    my_msg.set[""]  # Clears input field.
    client_socket.send[bytes[msg, "utf8"]]
    if msg == "{quit}":
        client_socket.close[]
        top.quit[]


def on_closing[event=None]:
    my_msg.set["{quit}"]
    send[]

top = tkinter.Tk[]
top.title["Chatter"]

messages_frame = tkinter.Frame[top]
my_msg = tkinter.StringVar[]  # For the messages to be sent.
my_msg.set["Nhập tên của bạn!."]
scrollbar = tkinter.Scrollbar[messages_frame]  # To navigate through past messages.
# Following will contain the messages.
msg_list = tkinter.Listbox[messages_frame, height=15, width=50, yscrollcommand=scrollbar.set]
scrollbar.pack[side=tkinter.RIGHT, fill=tkinter.Y]
msg_list.pack[side=tkinter.LEFT, fill=tkinter.BOTH]
msg_list.pack[]
messages_frame.pack[]

entry_field = tkinter.Entry[top, textvariable=my_msg]
entry_field.bind["", send]
entry_field.pack[]
send_button = tkinter.Button[top, text="Gửi", command=send]
send_button.pack[]

top.protocol["WM_DELETE_WINDOW", on_closing]

#Ket noi toi server
HOST = '127.0.0.1'
PORT = 33000
if not PORT:
    PORT = 33000
else:
    PORT = int[PORT]

BUFSIZ = 1024
ADDR = [HOST, PORT]

client_socket = socket[AF_INET, SOCK_STREAM]
client_socket.connect[ADDR]

receive_thread = Thread[target=receive]
receive_thread.start[]
tkinter.mainloop[]  # Starts GUI execution.

Chạy chương trình

Đầu tiên ta chạy file server.py sau đó là các client. Có rất nhiều cách khác nhau, bài này chỉ là 1 cách đơn giản trong số đó thôi.

chat socket in python

Cảm ơn các bạn đã ghé thăm. Chúc các bạn thành công!

Chủ Đề