Làm thế nào để bạn tạo một hệ thống trò chuyện trong python?

Xin chào các bạn, tôi sẽ chỉ cho các bạn cách xây dựng một ứng dụng trò chuyện nhóm nhiều người dùng bằng Python. Mục tiêu của hướng dẫn này là giúp bạn bắt đầu với Lập trình mạng (mô hình ứng dụng máy khách/máy chủ) trong Python. Tin tốt là các khái niệm này cũng có thể áp dụng cho các ngôn ngữ lập trình khác. Tôi nghĩ tốt nhất là tiếp cận lập trình như một khái niệm thay vì một ngôn ngữ

Tôi sẽ cho rằng bạn đã cài đặt và thiết lập Python trên máy tính của mình. Để tìm hiểu thêm về python và cách thiết lập nó, vui lòng xem tài liệu chính thức. Bạn có thể sử dụng một IDE mà bạn chọn. Cá nhân tôi thích PyCharm hơn. Tôi sẽ sử dụng thư viện Python GUI phổ biến. Tkinter dành cho Giao diện người dùng - dù sao cũng thích các ứng dụng dòng lệnh nhàm chán. ) Nếu chưa, thì bạn nên xem hướng dẫn đầu tiên của tôi có tiêu đề "Tìm hiểu Python bằng cách xây dựng trò chơi đoán GUI với Tkinter" trong đó tôi trình bày chi tiết hơn về cách sử dụng thư viện Tkinter. Tôi hứa, việc tạo các thành phần GUI bằng Tkinter rất dễ dàng, đặc biệt nếu bạn đã làm việc với Java Swing, C# Window Form hoặc HTML/CSS. Trong mọi trường hợp, nó vẫn rất dễ hiểu

Ứng dụng trò chuyện nhóm sẽ cho phép nhiều người dùng kết nối với máy chủ và trò chuyện với tất cả những người dùng trực tuyến khác. Ứng dụng hoạt động theo kiểu phát sóng. Điều này có nghĩa là tin nhắn từ một người dùng được phát cho những người dùng khác. Video bên dưới hiển thị ứng dụng đang chạy cho bốn máy khách/người dùng được kết nối

Phiên chat nhóm của Chương trình

Tôi biết bạn đang nghĩ gì "hãy viết mã. "Vâng, tôi hoàn toàn đồng ý. ) Chúng tôi sẽ bắt đầu với mã máy chủ và sau đó chuyển sang phía máy khách

Ứng dụng máy chủ

Hãy bắt đầu với bố cục thành phần GUI trước khi chuyển sang logic mạng phía máy chủ thực tế. Đoạn mã cho cửa sổ chính phía máy chủ được cung cấp trong Hình. 1 bên dưới

Quả sung. 1. Đoạn mã giao diện người dùng ứng dụng máy chủ

Mã này đơn giản như vẻ ngoài của nó. ) Các khung được sử dụng để đặt một nhóm tiện ích vào các khu vực cụ thể trong cửa sổ chính. Lưu ý rằng "topFrame" bao gồm nút "Kết nối" và "Dừng". Có thể đưa ra nhận xét tương tự cho "middleFrame" và "clientFrame. " Lưu ý rằng đoạn mã để tạo một nút (e. g. Dòng 7) bao gồm một chức năng (e. g. "start_server") được gọi khi nhấp vào nút

Quả sung. 2. Cửa sổ ứng dụng máy chủ

Quả sung. 2 hiển thị đầu ra của mã. Hiện tại, khi nhấp vào nút "Kết nối", chúng tôi đang bật nút "Dừng" và tắt nút "Kết nối"'. Nhưng chúng tôi muốn làm nhiều hơn là chỉ bật/tắt các nút phải không? . Tôi sẽ thảo luận về các chức năng máy chủ riêng lẻ thay vì làm bạn bối rối với nhiều dòng mã cùng một lúc. ) Bạn có thể sao chép/tải xuống toàn bộ mã nguồn ứng dụng trên github. Hãy bắt đầu với chức năng start_server được gọi khi nhấp vào nút "Kết nối". Quả sung. 3 bên dưới hiển thị đoạn mã

Quả sung. 3. Bắt đầu đoạn mã máy chủ

Dòng 1 nhập thư viện ổ cắm. Điều này rất quan trọng để xử lý giao tiếp mạng. Nhưng, một ổ cắm là gì? . Nói một cách đơn giản, socket cung cấp cho chúng ta kênh liên lạc hai chiều để gửi và nhận dữ liệu. Xem tài liệu chính thức để biết thêm thông tin về chủ đề này. Máy chủ tuyệt vời của chúng tôi sẽ có thể chấp nhận các yêu cầu kết nối máy khách mới trong khi xử lý tin nhắn từ các máy khách được kết nối. Vì vậy, chúng tôi cần "luồng" cho các tác vụ song song như vậy nếu chúng tôi không muốn làm tắc luồng Main và GUI. Vẫn không chắc chắn tại sao chúng ta cần chủ đề? . Thư viện chủ đề được nhập trong Dòng 2. Ổ cắm máy chủ được tạo trong Dòng 21 cho IPv4 (ổ cắm. AF_INET) và giao thức TCP (ổ cắm. SOCK_STREAM)

Chúng tôi liên kết máy chủ với địa chỉ máy chủ và số cổng trong Dòng 22 và bắt đầu lắng nghe kết nối máy khách trong Dòng 23. Như đã nêu trước đó, chúng tôi muốn có thể tiếp tục lắng nghe và chấp nhận các yêu cầu kết nối máy khách mới trong khi gửi và nhận tin nhắn từ các máy khách đã được kết nối. Vì vậy, chúng tôi cần một luồng mới để chấp nhận các yêu cầu kết nối máy khách mới (Dòng 25) và một luồng khác để xử lý việc gửi/nhận tin nhắn của máy khách

Tiếp theo, hãy xem hàm accept_clients. Đoạn mã được hiển thị trong Hình. 4 bên dưới

Quả sung. 4. Chấp nhận đoạn mã khách hàng mới

Máy chủ chấp nhận yêu cầu kết nối máy khách mới và lưu trữ thông tin máy khách (đối tượng kết nối) trong một danh sách (i. e. khách hàng). Điều này cho phép chúng tôi theo dõi tất cả các khách hàng được kết nối. Tất nhiên, chúng ta sẽ cần xóa đối tượng client khỏi danh sách khi client ngắt kết nối. Tiếp theo, chúng tôi bắt đầu một chuỗi mới để xử lý việc gửi/nhận tin nhắn của khách hàng. Hãy xem đoạn mã cho chức năng

Quả sung. 5. Gửi và nhận đoạn mã tin nhắn

Quả sung. 5 hiển thị đoạn mã để gửi/nhận tin nhắn của khách hàng. Tôi cũng đã bao gồm hai chức năng trợ giúp (hy vọng) tự giải thích. ). Chức năng trợ giúp đầu tiên tôi. e. get_client_index(…) trả về chỉ mục khách hàng hiện tại trong danh sách khách hàng. Điều này đặc biệt hữu ích để xử lý hai kịch bản. (i) Khi máy khách ngắt kết nối, chúng tôi cần biết chỉ mục máy khách trong danh sách máy khách để chúng tôi có thể xóa máy khách một cách an toàn (ii) Chúng tôi muốn gửi tin nhắn máy khách tới TẤT CẢ máy khách kết nối khác NGOẠI TRỪ máy khách gửi tin nhắn (i. e. không có tiếng vang). Máy chủ có một khu vực để hiển thị tên khách hàng được kết nối — hãy gọi đó là "hiển thị tên khách hàng". Hàm trợ giúp thứ hai tôi. e. update_client_names_display(…) về cơ bản cập nhật hiển thị tên máy khách khi máy khách kết nối (thêm) hoặc ngắt kết nối (xóa). Bây giờ chúng ta hãy xem xét chức năng gửi/xóa thực tế vì chúng ta đã có các chức năng của trình trợ giúp

Khi một máy khách mới kết nối, nó sẽ gửi tên của nó đến máy chủ. Máy chủ nhận tên của máy khách bằng cách sử dụng ổ cắm. recv (Dòng 11 trong đó ổ cắm là ổ cắm máy khách được kết nối) và gửi thông báo chào mừng bằng cách sử dụng ổ cắm. gửi phương thức cho khách hàng (Dòng 12). Tên khách hàng mới được kết nối được lưu trong danh sách tên khách hàng và "hiển thị tên khách hàng" được cập nhật trong Dòng 16. Tiếp theo, máy chủ tham gia vào một vòng lặp cho phép nó tiếp tục nhận và gửi tin nhắn cho khách hàng. Chúng tôi thoát khỏi vòng lặp này nếu kết nối máy khách bị mất hoặc thông báo máy khách là "exit. " Trong cả hai trường hợp, chúng tôi xóa máy khách (tên và ổ cắm) bị ngắt kết nối khỏi danh sách tương ứng, đóng kết nối máy khách và xóa tên máy khách khỏi khu vực hiển thị máy chủ (tên máy khách) (Dòng 35 đến Dòng 38). Mặt khác, tin nhắn của máy khách sẽ được chuyển tiếp tới tất cả các máy khách được kết nối khác (ngoại trừ người gửi - Dòng 26 đến 31). Điều này kết thúc phía máy chủ của ứng dụng trò chuyện nhiều người dùng tuyệt vời của chúng tôi. Tiếp theo, hãy nhìn vào phía khách hàng

Ứng dụng khách

Ứng dụng khách chịu trách nhiệm bắt đầu kết nối với máy chủ và gửi tin nhắn được chuyển tiếp (bởi Máy chủ) tới tất cả các máy khách được kết nối khác. Hãy bắt đầu bằng cách xem xét GI của máy khách trước khi thảo luận về logic của máy khách. Quả sung. 6 bên dưới hiển thị đoạn mã cho GUI máy khách, trong khi Hình. 7 hiển thị đầu ra tương ứng

Quả sung. 7. Ứng dụng GUI của máy khách

Bây giờ, hãy thảo luận về các chức năng Máy khách riêng lẻ để kết nối, gửi và nhận tin nhắn từ ứng dụng máy chủ tuyệt vời của chúng tôi. Khi nhấp vào nút kết nối, nó sẽ kích hoạt một chức năng gọi là kết nối (). Việc thực hiện chức năng này được cung cấp trong hình. số 8

Quả sung. số 8. Đoạn mã sự kiện nút kết nối

Chức năng kiểm tra tên người dùng đã được nhập trước khi cố gắng kết nối với máy chủ. Sau đó, nó gọi hàm connect_to_server nơi yêu cầu kết nối máy chủ thực sự được bắt đầu. Đoạn mã cho chức năng này được đưa ra trong hình. 9

Quả sung. 9. Kết nối với đoạn mã máy chủ

Chức năng này (hy vọng) tự giải thích. Đầu tiên, chúng ta tạo client socket (tương tự server socket). Sử dụng đối tượng ổ cắm, chúng tôi bắt đầu yêu cầu kết nối đến máy chủ (thông qua địa chỉ và số cổng). Sau đó, tên khách hàng được gửi đến máy chủ. Hãy nhớ lại rằng máy chủ tuyệt vời của chúng tôi phản hồi bằng cách gửi lại tin nhắn chào mừng "ngọt ngào" cho khách hàng. Chúng tôi cũng kích hoạt khu vực tin nhắn để khách hàng của chúng tôi có thể bắt đầu gửi tin nhắn đến máy chủ (Dòng 17). Tiếp theo, chúng tôi bắt đầu một chuỗi để tiếp tục nhận tin nhắn từ máy chủ. Nhớ lại rằng chúng tôi sử dụng một luồng ở đây vì chúng tôi không muốn làm tắc nghẽn luồng GUI. GUI sẽ đóng băng nếu không có chủ đề này - hãy thử. Bây giờ hãy xem chức năng nhận tin nhắn từ máy chủ. Điều này được cung cấp trong đoạn mã trong Hình. 10 dưới đây

Quả sung. 10. Nhận tin nhắn từ phương thức Máy chủ

Tôi hứa, mã này đơn giản như vẻ ngoài của nó. Chúng tôi chạy một vòng lặp liên tục để nhận tin nhắn từ máy chủ (thông qua ổ cắm máy khách). Thông báo máy chủ đã nhận được thêm vào khu vực hiển thị trò chuyện của khách hàng (Dòng 14 - 22) và chúng tôi đã hoàn tất. Đúng. Tôi đã nói với bạn nó rất đơn giản

Vì vậy, chúng tôi đã thấy cách kết nối với máy chủ, gửi tên người dùng của chúng tôi đến máy chủ và nhận tin nhắn từ máy chủ. Tiếp theo, hãy xem cách truy xuất và gửi tin nhắn (được nhập trong khu vực tin nhắn trò chuyện) đến máy chủ siêu tuyệt vời của chúng tôi. Nếu bạn xem lại GUI ứng dụng của chúng tôi, bạn có thể nhận thấy rằng có một khu vực (Tiện ích văn bản) nơi người dùng có thể nhập tin nhắn trò chuyện nhưng không có nút "gửi". Làm cách nào để chúng tôi chuyển tiếp tin nhắn đã nhập trong tiện ích Văn bản đến máy chủ? . Nhưng trong trường hợp này, chúng tôi liên kết tiện ích Văn bản với sự kiện Quay lại để sự kiện được kích hoạt khi người dùng của chúng tôi nhấn phím "Enter/Return" trên bàn phím của họ. Khi họ thực hiện, chúng tôi gọi một chức năng để nhận tin nhắn. Đoạn mã cho chức năng được cung cấp trong Hình. 11 bên dưới

Quả sung. 11. Chức năng lấy tin nhắn của khách hàng

Bản thân chức năng này thực sự tự giải thích. Chúng tôi nhận được tin nhắn được nhập vào tiện ích Văn bản và nối tin nhắn vào khu vực hiển thị cửa sổ trò chuyện. Chú ý các thẻ trong Dòng 12 và 14? . Đơn giản, tin nhắn của người dùng được hiển thị bằng văn bản màu xanh lam trong khi tin nhắn từ các máy khách được kết nối khác được hiển thị bằng màu đen. Vì chúng tôi muốn các máy khách được kết nối khác nhìn thấy tin nhắn của mình, chúng tôi gửi tin nhắn đến máy chủ (để máy chủ có thể chuyển tiếp tin nhắn đến tất cả các máy khách được kết nối khác). Với mục đích này, chúng ta gọi hàm send message_to_server. Đoạn mã cho chức năng này được đưa ra trong hình. 12

Quả sung. 12. Gửi tin nhắn đến đoạn mã máy chủ

Tôi chắc rằng bạn có thể tìm ra những gì mã làm. ) Nó gửi tin nhắn đến máy chủ bằng chức năng "gửi" của đối tượng ổ cắm. Sau đó, nó đóng ổ cắm máy khách và phá hủy cửa sổ trò chuyện nếu thông báo của người dùng thoát ra và vâng, chúng tôi đã hoàn tất

Hướng dẫn này cho thấy cách tạo một ứng dụng trò chuyện nhóm nhiều người dùng trong Python. Chúng tôi đã đề cập đến các khái niệm rất quan trọng như mạng và luồng trong hướng dẫn này. Tôi hy vọng rằng bạn sẽ có thể sử dụng kiến ​​thức thu được trong hướng dẫn này để tạo các ứng dụng/trò chơi mạng cực hay. Bạn có thể sao chép/tải xuống toàn bộ mã nguồn trên github của tôi

Làm cách nào để tạo một máy chủ trò chuyện bằng Python?

Đầu tiên, tạo một tệp có tên máy chủ. py. .
Nhập thư viện cần thiết. nhập ổ cắm nhập sys thời gian nhập. .
Tạo Socket và lấy Hostname. .
Ràng buộc máy chủ và cổng. .
Lắng nghe kết nối. .
Chấp nhận kết nối đến. .
Lưu trữ dữ liệu kết nối đến. .
Gửi gói tin/tin nhắn. .
Nhập thư viện

Làm cách nào để tạo một máy chủ trò chuyện?

Bước 1. Thiết lập ServerSocket trong Lớp máy chủ. .
Bước 2. Tạo một Ổ cắm trong Lớp Đăng nhập. .
Bước 3. Tạo vòng lặp để liên tục chấp nhận khách hàng. .
Bước 4. Tạo chủ đề máy khách. .
Bước 5. Tạo chủ đề máy chủ. .
Bước 6. Tạo Chủ đề Máy khách Gửi và Nhận Dữ liệu. .
Bước 7. Tạo luồng máy chủ gửi và nhận dữ liệu