Hướng dẫn tcp chat room python - pcp chat room python

Trong bài viết này, mình sẽ hướng dẫn các bạn cách xây dựng một ứng dụng chat command line trong Python bằng thư viện socket. Nếu bạn chưa biết socket là gì, thì cũng đừng lo lắng. Mình sẽ giải thích nó ngay thôi.

Hướng dẫn tcp chat room python - pcp chat room python

Socket là gì?

Sockets là hai điểm cuối (end points) có thể giao tiếp với nhau trên cùng một máy tính hoặc trên các thiết bị không dây.

Socket chính là xương sống của hệ thống Internet, trong sâu thẳm tất cả những giao tiếp mà chúng ta thấy ngày nay đều hoạt động từ giao tiếp điểm này đến điểm khác.

Lập trình socket là cách làm cho hai node trên mạng giao tiếp với nhau. Một socket lắng nghe trên một cổng cụ thể tại một IP (máy chủ), trong khi một socket khác kết nối với socket kia để tạo kết nối (máy khách).node trên mạng giao tiếp với nhau. Một socket lắng nghe trên một cổng cụ thể tại một IP (máy chủ), trong khi một socket khác kết nối với socket kia để tạo kết nối (máy khách).node trên mạng giao tiếp với nhau. Một socket lắng nghe trên một cổng cụ thể tại một IP (máy chủ), trong khi một socket khác kết nối với socket kia để tạo kết nối (máy khách).

Các mô-đun socket đều mặc định có sẵn trong thư viện của Python. Do đó, bạn không cần phải cài đặt bất kỳ thư viện nào nữa.

Cấu trúc dự án

Như cách giải thích ở trên, socket là các node có thể giao tiếp với nhau. Và trong dự án này, chúng ta sẽ triển khai 2 nodes bằng cách sử dụng socket, một là server và một là client.server và một là client.server và một là client.

Hai node đó sẽ gửi tin nhắn cho nhau như một ứng dụng chat bình thường.

Giới thiệu về lập trình socket

Mở command prompt và chạy thử các lệnh dưới đây.

Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket 
>>> socket.gethostname() #getting our local host name
'kalebu-PC'
>>> socket.gethostbyname('www.google.com') #getting IP of Google 
'172.217.170.4'

Như chúng ta thấy trong ví dụ trên, các bạn có thể lấy tên host của mình bằng phương thức gethostname và lấy địa chỉ IP của Google bằng phương thức gethostbyname.gethostname và lấy địa chỉ IP của Google bằng phương thức gethostbyname.gethostname và lấy địa chỉ IP của Google bằng phương thức gethostbyname.

Tạo socket đầu tiên (nodes)

Có rất nhiều giao thức truyền thông được sử dụng ngoài kia, tùy thuộc vào nơi nó đang được áp dụng, chẳng hạn như Transmission communication Protocol (TCP), User Datagram Protocol (UDP), File transfer Protocol (FTP),…TCP), User Datagram Protocol (UDP), File transfer Protocol (FTP),…TCP), User Datagram Protocol (UDP), File transfer Protocol (FTP),…

Để tạo ứng dụng Chat, các bạn sẽ sử dụng giao thức Transmission communication protocol (TCP). Nếu bạn không hiểu về giao thức này thì cũng không sao cả.

Để tạo một sockets (nodes) trong Python cho TCP, chúng ta sẽ cần các tham số chính sau đây:

  • socket.AF_INET nghĩa là socket thuộc IPv4..
  • socket.SOCK_STREAM nghĩa là kết nối được cấu hình bằng TCP Protocol

Tạo một socket trong python:

>>> import socket 
>>> node = socket.socket(socket.AF_INET, socket.SOCK_SaTREAM)

Nodes ở trên hoạt động như client hoặc server trên ứng dụng chat của chúng ta, tất cả phụ thuộc vào cách chúng ta cấu hình nó, vì chúng ta sẽ tạo 2 ứng dụng, đầu tiên chúng ta cần tạo nodes server.

Tạo nodes Server

Mình là người lập trình hướng đối tượng (OPP). Do đó, mình sẽ triển khai nodes server dưới dạng class.

Vì mình đang xây dựng nodes này như một server, nên mình sẽ thêm một số chức năng cho phép nodes này lắng nghe yêu cầu kết nối đến.

Tạo file Server.py

import socket 
import threading

class ServerNode:
    def __init__(self):
        self.node = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        port_and_ip = ('127.0.0.1', 12345)
        self.node.bind(port_and_ip)
        self.node.listen(5)
        self.connection, addr = self.node.accept()

    def send_sms(self, SMS):
        self.connection.send(SMS.encode())

    def receive_sms(self):
        while True:
            data = self.connection.recv(1024).decode()
            print(data)

    def main(self):
        while True:
            message = input()
            self.send_sms(message)

server = ServerNode()
always_receive = threading.Thread(target=server.receive_sms)
always_receive.daemon = True
always_receive.start()
server.main()

Giải thích code

Gán địa chỉ IP và Port

port_and_ip = ('127.0.0.1', 12345)
self.node.bind(port_and_ip)

Việc ràng buộc địa chỉ IP và port với nodes của chúng ta giống như mình đang sử dụng chìa khoá IP để vào phòng của port nơi node server sống. Do đó, client phải cần chìa khoá IP này để kết nối với server.

Có nghĩa là node client phải truy cập chính xác IP server và port để kết nối với nodes server. Trong bản demo này, mình sẽ thực hiện kết nối trên một máy nhưng bạn cũng có thể thực hiện trong mạng được kết nối bằng cách thay đổi địa chỉ IP.

Lắng nghe kết nối

self.node.listen(5)
self.connection, addr = self.node.accept()

Nodes server sẽ lắng nghe kết nối đến và sau đó chấp nhận kết nối này.

Hàm send_sms()

def send_sms(self, SMS):
    self.connection.send(SMS.encode())

Phương thức này dùng để gửi tin nhắn khi được kết nối, tin nhắn phải ở dạng byte trong quá trình truyền, do đó tại sao chúng ta lại sử dụng phương thức encode () trên chuỗi.

Hàm receive_sms( )

def receive_sms(self):
    while True:
        data = self.connection.recv(1024).decode()
        print(data)

Hàm này được sử dụng để nhận thông báo từ client trong suốt lúc chương trình hoạt động, nó sẽ được phân luồng để ngăn ứng dụng bị đơ/lag.

Hàm Main()

def receive_sms(self):
    while True:
        data = self.connection.recv(1024).decode()
        print(data)

Hàm này được sử dụng để hiển nhập tin nhắn từ server và gửi nó đến client.

Gọi hàm

server = ServerNode()
always_receive = threading.Thread(target=server.receive_sms)
always_receive.daemon = True
always_receive.start()
server.main()

5 dòng code trên là để tạo server và sau đó chạy nó bằng cách phân luồng các hàm nhận (hàm receive_sms).

Tạo nodes Client

Hầu hết mọi thứ trên node client đều tương tự như node server ngoại trừ thực tế là node client đang kết nối với server thay vì lắng nghe kết nối.

Tạo file Client.py

import socket 
import threading

class ClientNode:
    def __init__(self):
        self.node = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        port_and_ip = ('127.0.0.1', 12345)
        self.node.connect(port_and_ip)

    def send_sms(self, SMS):
        self.node.send(SMS.encode())

    def receive_sms(self):
        while True:       
            data = self.node.recv(1024).decode()
            print(data)

    def main(self):
        while True:
            message = input()
            self.send_sms(message)

Client = ClientNode()
always_receive = threading.Thread(target=Client.receive_sms)
always_receive.daemon = True
always_receive.start()
Client.main()

Vậy là xong rồi đó. Để chạy ứng dụng chat, bạn cần chạy file server.py trước rồi mới chạy file client.py.

Ngoài tạo ứng dụng Chat ra, bạn còn có thể xem bài hướng dẫn tạo ứng dụng tra số điện thoại thuộc quốc gia nào bằng Python của Anonyviet nữa đó.