Ở đâ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
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
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:
[
"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]