Máy khách-máy chủ python

Ở đây mình 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 và client 2. py

Ứng Dụng Chat Nội Bộ

Tạo máy chủ 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[]

Create client connect to server

Tại máy khách, chúng tôi sẽ tạo giao diện bằng thư viện tkinter và các hàm sử dụng lý liệu cho dữ liệu, cách kết nối đến máy chủ từ máy khách. Đoạn mã sau sẽ áp dụng cho tệp Client. py và client2. py or more than


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.

Run program

First run file server. py after that is 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

Cho dù bạn là loại kỹ sư phần mềm nào, tại một số thời điểm trong sự nghiệp, bạn sẽ phải tương tác với các máy chủ web. Bạn có thể đang xây dựng API máy chủ cho các dịch vụ phụ trợ. Hoặc có thể bạn chỉ đang cấu hình một máy chủ web cho trang web của bạn

Việc làm cao lương trăn cho bạn

Trong bài viết này, tôi sẽ đề cập đến cách tạo máy chủ web http cơ bản nhất trong Python

Nhưng vì tôi muốn chắc chắn rằng bạn hiểu những gì chúng tôi đang xây dựng, tôi sẽ đưa ra một cái nhìn tổng thể trước tiên về máy chủ web là gì và cách chúng hoạt động

Nếu bạn đã biết máy chủ web hoạt động như thế nào, thì bạn có thể bỏ qua ngay phần này

Máy chủ HTTP là gì?

Máy chủ web HTTP không có gì ngoài một quy trình đang chạy trên máy của bạn và thực hiện chính xác hai điều

1- Listen các yêu cầu http đến trên một địa chỉ cụ thể của ổ cắm TCP [địa chỉ IP và số cổng mà tôi sẽ nói về sau]

2- Xử lý yêu cầu này và gửi phản hồi lại cho người dùng

Cụ thể thì hãy xem ví dụ sau

Hãy tưởng tượng bạn kéo trình duyệt Chrome của mình lên và nhập www. Yahoo. com  vào thanh địa chỉ

Tất nhiên, bạn sẽ nhận được trang chủ Yahoo được hiển thị trên cửa sổ trình duyệt của bạn

Nhưng những gì thực sự chỉ xảy ra?

Trên thực tế có rất nhiều điều đã xảy ra và tôi có thể dành cả một bài viết để giải thích sự kỳ lạ đằng sau sự việc này xảy ra như thế nào

At level cao, when you enter www. Yahoo. com  trình duyệt của mình, trình duyệt của bạn sẽ tạo một thông báo mạng được gọi là yêu cầu HTTP

Yêu cầu này sẽ đi đến tất cả các máy tính Yahoo có máy chủ web đang chạy trên đó. Máy chủ web này sẽ chặn yêu cầu của bạn và xử lý nó bằng cách phản hồi lại bằng html của trang chủ Yahoo

Cuối cùng, quá trình duyệt của bạn hiển thị html này trên màn hình và đó là những gì bạn thấy trên màn hình

Mọi người tương tác với trang chủ Yahoo sau đó [ví dụ. khi bạn nhấp vào liên kết] sẽ bắt đầu một yêu cầu mới và phản hồi chính xác như yêu cầu ban đầu

Để nhắc lại, máy nhận yêu cầu http có một quy trình phần mềm được gọi là máy chủ web chạy trên nó. Máy chủ web này chịu trách nhiệm chặn các yêu cầu này và xử lý chúng theo một cách thích hợp

Được rồi, bây giờ bạn đã biết máy chủ web là gì và chức năng của nó chính xác là gì, bạn có thể tự hỏi làm thế nào để yêu cầu đến được máy chủ yahoo đó ngay từ đầu?

Câu hỏi hay

Trong thực tế đây là một trong những câu hỏi về người yêu thích của tôi mà tôi hỏi các ứng viên tiềm năng trong một cuộc phỏng vấn lập trình viên

Hãy để tôi giải thích thế nào, nhưng một lần nữa

Địa chỉ ổ cắm TCP

Bất kỳ tin nhắn http nào [cho dù đó là yêu cầu hay phản hồi] đều cần biết cách đến đích

Để đến đích, mỗi thông báo http mang một địa chỉ được gọi là địa chỉ TCP đích

Và mỗi địa chỉ TCP bao gồm một địa chỉ IP và số cổng

Tôi biết tất cả các từ viết tắt [TCP, IP, v. v. ] có thể đảo ngược nếu khái niệm mạng của bạn không mạnh

Tôi sẽ cố gắng làm cho nó đơn giản nhưng nếu bạn quan tâm đến việc nâng cao kiến ​​thức về khái niệm mạng, tôi đánh giá cao cuốn sách này của Ross và Kurose

Do đó địa chỉ đó ở đâu khi tất cả những gì bạn đã làm là nhập www. Yahoo. com  trình duyệt của bạn?

Chà, tên miền này đã được chuyển đổi thành địa chỉ IP thông qua cơ sở dữ liệu phân tán lớn được gọi là DNS

Bạn muốn kiểm tra địa chỉ IP này thì còn gì bằng?

Easy easy. Truy cập cmd trên windows hoặc terminal trên linux và gõ lệnh sau

ping yahoo.com

Như bạn có thể thấy, DNS sẽ dịch yahoo. com sang bất kỳ địa chỉ nào ở trên

Địa chỉ IP riêng sẽ cho phép tin nhắn HTTP đến đúng máy chủ, nhưng bạn vẫn cần số cổng để yêu cầu HTTP đến chính xác máy chủ web

Nói cách khác, máy chủ web là một ứng dụng mạng thông tin thường xuyên đang lắng nghe trên một cổng cụ thể

And request http is being Send to that port

Nhập số cổng ở đâu khi bạn nhập www. Yahoo. com ?

Theo mặc định, số cổng là 80 cho http và 443 cho https , làm như vậy, mặc dù bạn chưa xác định rõ cổng số, nó vẫn ở đó

Và nếu máy chủ web đang nghe số cổng không mặc định [không phải 80 hay 443], bạn phải chỉ định số cổng rõ ràng như thế này

Bây giờ bạn sẽ có tất cả các thông tin cần thiết để tạo một máy chủ web http trong Python

Vì vậy, không có thêm rắc rối, hãy bắt đầu

Tạo một đơn giản tệp HTML

Đây là những gì chúng tôi muốn làm

Chúng tôi muốn tạo một máy chủ http đơn giản phục vụ trang web html tĩnh

Hãy tạo trang html của chúng tôi

              Python is awesome!                   

Nguyenpv.com

        

Congratulations! The HTTP Server is working!

         

Hiện tại, hãy tiếp tục và lưu tệp này dưới dạng  index. html

Với trang web mà chúng tôi muốn phục vụ theo cách khác, bước tiếp theo là tạo một máy chủ web sẽ phục vụ trang html này

Tạo HTTP máy chủ web

Để tạo web máy chủ trong Python 3 , bạn cần nhập 2 mô-đun. http. máy chủ  và  socketserver

Lưu ý rằng trong Python 2 , có một mô-đun có tên  SimpleHTTPServer. Mô-đun này đã được hợp nhất vào http. máy chủ trong Python 3

Chúng ta hãy xem mã để tạo một máy chủ http

import http.serverimport socketserver PORT = 8080Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer[["", PORT], Handler] as httpd:     print["serving at port", PORT]     httpd.serve_forever[]

Bây giờ hãy phân tích từng dòng mã này

Đầu tiên, như tôi đã đề cập trước đó, máy chủ web là một quá trình lắng nghe các yêu cầu đến địa chỉ TCP cụ thể

Và như bạn đã biết bây giờ, một địa chỉ TCP được xác định bởi một địa chỉ IP và số cổng

Thứ hai, một máy chủ web cũng cần được biết cách xử lý các yêu cầu đến

Những yêu cầu đến được xử lý bởi các xử lý đặc biệt. Bạn có thể nghĩ về một máy chủ web như một người điều hành, một yêu cầu đến, máy chủ http kiểm tra yêu cầu và gửi nó đến một trình xử lý được chỉ định.

Tất nhiên những người xử lý này có thể làm bất cứ điều gì bạn muốn

Nhưng bạn nghĩ xử lý cơ bản nhất là gì?

Vâng, đó sẽ là một trình xử lý phục vụ duy nhất cho một tệp tệp tĩnh

Nói cách khác, khi tôi truy cập yahoo. com , máy chủ web ở đầu kia sẽ gửi lại một tệp html tĩnh

Đây thực tế là những gì chúng tôi đang cố gắng làm chính xác

Và đó, bạn của tôi, là  http. người phục vụ. SimpleHTTPRequestHandler  là gì. một trình xử lý yêu cầu HTTP đơn giản phục vụ các tệp từ thư mục hiện tại và bất kỳ thư mục con nào của nó.

Bây giờ hãy nói về lớp socketserver. Máy chủ TCP

Một phiên bản của TCPServer mô tả máy chủ sử dụng giao thức TCP để gửi và nhận tin nhắn [http là lớp giao thức ứng dụng trên TCP đầu tiên]

Để khởi động máy chủ TCP, chúng tôi cần hai điều

1- Địa chỉ TCP [địa chỉ IP và số cổng]

2- Người xử lý

socketserver.TCPServer[["", PORT], Handler]

Như bạn có thể thấy, địa chỉ TCP được truyền dưới dạng một bộ của  [địa chỉ ip, cổng]

IP bằng rỗng có nghĩa là máy chủ sẽ lắng nghe trên bất kỳ giao diện mạng nào [tất cả các địa chỉ IP có sẵn]

Và vì PORT lưu trữ giá trị 8080 nên máy chủ sẽ lắng nghe các yêu cầu đến trên cổng đó

Đối với handler, chúng ta đang vượt qua trình xử lý đơn giản mà chúng ta đã nói trước đó

Handler = http.server.SimpleHTTPRequestHandler

Vâng, làm thế nào về  serve_forever  ?

Serve_forever là một phương thức trên phiên bản TCPServer khởi động máy chủ và bắt đầu lắng nghe và trả lời các yêu cầu đến

Thật tuyệt vời, hãy lưu tệp này dưới dạng máy chủ. py trong cùng thư mục với chỉ mục. html vì theo mặc định, SimpleHTTPRequestHandler sẽ tìm một tệp có tên chỉ mục. html trong thư mục hiện tại

Trong thư mục đó, khởi động máy chủ web

$ python server.py

Bằng cách đó, giờ đây bạn có một máy chủ HTTP lắng nghe trên bất kỳ giao diện nào tại cổng 8080 đang chờ các yêu cầu http đến

Bây giờ là thời gian cho các thú vị thứ

Mở trình duyệt của bạn và nhập localhost. 8080 vào thanh địa chỉ

Tuyệt vời. Hình như tất cả các hoạt động tốt

Nhưng localhost là gì?

localhost là tên máy chủ có nghĩa là máy tính này. Nó được sử dụng để truy cập các dịch vụ mạng đang chạy trên máy chủ thông qua mạng loopback

Và vì máy chủ web đang nghe trên bất kỳ giao diện nào , nó cũng đang nghe trên loopback giao diện

Trong thực tế, bạn hoàn toàn có thể thay thế localhost bằng 127. 0. 0. 1 trong trình duyệt của mình và bạn vẫn sẽ nhận được kết quả tương tự

Cuối cùng

Bạn thực sự có thể bắt đầu một máy chủ web với python mà không cần phải viết bất kỳ tập lệnh nào

Chỉ cần vào cmd [windows] hoặc terminal [linux] trên máy tính của bạn và làm như sau [nhưng hãy chắc chắn rằng bạn đang ở trên python 3]

Chủ Đề