Lập trình Socket trong Python là gì và làm thế nào để thành thạo nó?

Tìm hiểu Lập trình Socket trong Python là gì cùng với giao tiếp máy khách-máy chủ cùng với việc chuyển các đối tượng python bằng cách sử dụng pickle và sockets.

Không thể phủ nhận Internet đã trở thành ‘Linh hồn của sự tồn tại’ và hoạt động của nó được đặc trưng bởi ‘Kết nối’ hoặc ‘Mạng’. Các mạng này có thể thực hiện được bằng cách sử dụng một trong những nguyên tắc cơ bản quan trọng nhất của Ổ cắm. Bài viết này bao gồm tất cả các lĩnh vực liên quan đến Lập trình Socket trong Python. Sockets giúp bạn thực hiện những kết nối này, trong khi , chắc chắn, làm cho nó dễ dàng.

Hãy xem nhanh tất cả các chủ đề được đề cập trong bài viết này:





Tại sao sử dụng Sockets?
Sockets trong Python là gì?
Làm thế nào để đạt được Lập trình Socket trong Python
Máy chủ là gì?
Khách hàng là gì?
Echo Client-Server
Đa phương tiện
Chuyển các đối tượng Python



Tại sao sử dụng Sockets?

Sockets là xương sống của mạng. Chúng làm cho việc chuyển giao thông tin có thể thực hiện được giữa hai chương trình hoặc thiết bị khác nhau. Ví dụ: khi bạn mở trình duyệt của mình, bạn với tư cách là một khách hàng đang tạo kết nối với máy chủ để truyền thông tin.

Trước khi tìm hiểu sâu hơn về giao tiếp này, trước tiên hãy tìm hiểu xem chính xác những ổ cắm này là gì.

Sockets là gì?

Nói chung, socket là điểm cuối bên trong được xây dựng để gửi và nhận dữ liệu. Một mạng duy nhất sẽ có hai ổ cắm, một ổ cắm cho mỗi thiết bị hoặc chương trình giao tiếp. Các ổ cắm này là sự kết hợp của địa chỉ IP và Cổng. Một thiết bị có thể có ‘n’ số ổ cắm dựa trên số cổng đang được sử dụng. Các cổng khác nhau có sẵn cho các loại giao thức khác nhau. Hãy xem hình ảnh sau để biết thêm về một số số cổng phổ biến và các giao thức liên quan:




các cổng chung-SocketProgramminginPython-Edureka

Bây giờ bạn đã rõ về khái niệm ổ cắm, bây giờ chúng ta hãy xem xét mô-đun Socket của Python:

tạo một danh sách liên kết trong c

Làm thế nào để đạt được Lập trình Socket trong Python:

Để đạt được Lập trình Socket bằng Python, bạn sẽ cần nhập ổ cắm mô-đun hoặc . Mô-đun này bao gồm các phương thức tích hợp được yêu cầu để tạo các socket và giúp chúng liên kết với nhau.

Một số phương pháp quan trọng như sau:

Phương phápSự miêu tả

socket.socket ()

được sử dụng để tạo ổ cắm (bắt buộc trên cả máy chủ cũng như đầu máy khách để tạo ổ cắm)

socket.accept ()

được sử dụng để chấp nhận một kết nối. Nó trả về một cặp giá trị (conn, địa chỉ) trong đó conn là một đối tượng socket mới để gửi hoặc nhận dữ liệu và địa chỉ là địa chỉ của socket hiện diện ở đầu kia của kết nối

socket.bind ()

được sử dụng để liên kết với địa chỉ được chỉ định làm tham số

socket.close ()

được sử dụng để đánh dấu ổ cắm là đã đóng

socket.connect ()

được sử dụng để kết nối với một địa chỉ từ xa được chỉ định làm tham số

socket.listen ()

cho phép máy chủ chấp nhận kết nối

Bây giờ bạn đã hiểu tầm quan trọng của mô-đun socket, hãy tiếp tục xem nó có thể phục vụ như thế nào để tạo máy chủ và máy khách cho Lập trình Socket trong .

Máy chủ là gì?

Máy chủ là một chương trình, một máy tính hoặc một thiết bị dùng để quản lý tài nguyên mạng. Máy chủ có thể nằm trên cùng một thiết bị hoặc máy tính hoặc được kết nối cục bộ với các thiết bị và máy tính khác hoặc thậm chí từ xa. Có nhiều loại máy chủ khác nhau như máy chủ cơ sở dữ liệu, máy chủ mạng, máy chủ in, v.v.

Máy chủ thường sử dụng các phương thức như socket.socket (), socket.bind (), socket.listen (), v.v. để thiết lập kết nối và liên kết với máy khách. Bây giờ chúng ta hãy viết một chương trình để tạo một máy chủ. Hãy xem xét ví dụ sau:

THÍ DỤ:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #port number có thể là bất kỳ thứ gì trong khoảng 0-65535 (chúng tôi thường chỉ định các cổng không được đặc quyền là > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} yet ') #f string là chuỗi đen có tiền tố là f mà # chứa biểu thức python bên trong dấu ngoặc nhọn clt .send (byte ('Lập trình Socket bằng Python', 'utf-8')) # để gửi thông tin đến clientsocket

Như bạn có thể thấy, điều cần thiết đầu tiên để tạo một ổ cắm là nhập mô-đun ổ cắm. Sau đó, phương thức socket.socket () được sử dụng để tạo một ổ cắm phía máy chủ.

GHI CHÚ:

AF_INET đề cập đến Địa chỉ từ Internet và nó yêu cầu một cặp (máy chủ, cổng) trong đó máy chủ lưu trữ có thể là URL của một số trang web cụ thể hoặc địa chỉ của nó và số cổng là một số nguyên. SOCK_STREAM được sử dụng để tạo Giao thức TCP.

Phương thức bind () chấp nhận hai tham số như một tuple (máy chủ, cổng). Tuy nhiên, tốt hơn nên sử dụng các số cổng có 4 chữ số vì các số cổng thấp hơn thường bị chiếm dụng. Phương thức nghe () cho phép máy chủ chấp nhận các kết nối. Ở đây, 5 là hàng đợi cho nhiều kết nối xuất hiện đồng thời. Giá trị tối thiểu có thể được chỉ định ở đây là 0 (Nếu bạn cung cấp giá trị nhỏ hơn, giá trị đó sẽ được thay đổi thành 0). Trong trường hợp không có tham số nào được chỉ định, nó sẽ nhận một tham số phù hợp mặc định.

Các cho phép chấp nhận kết nối mãi mãi. ‘Clt’ và ‘adr’ là đối tượng và địa chỉ của khách hàng. Câu lệnh in chỉ in ra địa chỉ và số cổng của ổ cắm máy khách. Cuối cùng, clt.send được sử dụng để gửi dữ liệu theo byte.

Bây giờ máy chủ của chúng tôi đã được thiết lập xong, chúng ta hãy chuyển sang máy khách.

Khách hàng là gì?

Máy khách là một máy tính hoặc phần mềm nhận thông tin hoặc dịch vụ từ máy chủ. Trong mô-đun máy khách-máy chủ, máy khách yêu cầu dịch vụ từ máy chủ. Ví dụ tốt nhất là trình duyệt web như Google Chrome, Firefox, v.v. Các trình duyệt web này yêu cầu máy chủ web cho các trang web và dịch vụ bắt buộc theo chỉ dẫn của người dùng. Các ví dụ khác bao gồm trò chơi trực tuyến, trò chuyện trực tuyến, v.v.

Bây giờ chúng ta hãy xem cách viết mã chương trình phía máy khách trong :

THÍ DỤ:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Bước đầu tiên là nhập mô-đun ổ cắm và sau đó tạo một ổ cắm giống như bạn đã làm khi tạo máy chủ. Sau đó, để tạo kết nối giữa máy khách-máy chủ, bạn sẽ cần sử dụng phương thức connect () bằng cách chỉ định (máy chủ, cổng).


GHI CHÚ: gethostname được sử dụng khi máy khách và máy chủ trên cùng một máy tính. (LAN - localip / WAN - publicip)

Ở đây, máy khách muốn nhận một số thông tin từ máy chủ và để làm điều này, bạn cần sử dụng phương thức recv () và thông tin được lưu trữ trong một msg biến khác. Chỉ cần lưu ý rằng thông tin được chuyển sẽ ở dạng byte và trong ứng dụng khách trong chương trình trên có thể nhận tới 1024 byte (kích thước bộ đệm) trong một lần chuyển. Nó có thể được chỉ định cho bất kỳ số tiền nào tùy thuộc vào lượng thông tin được chuyển.

Cuối cùng, thông điệp được chuyển sẽ được giải mã và in.

Bây giờ bạn đã biết cách tạo các chương trình máy khách-máy chủ, hãy chuyển sang xem chúng cần được thực thi như thế nào.

Echo Client-Server:

Để thực thi các chương trình này, hãy mở dấu nhắc lệnh của bạn, vào thư mục nơi bạn đã tạo chương trình máy khách và máy chủ, sau đó nhập:

py server.py (ở đây, server.py là tên tệp của máy chủ, bạn cũng có thể sử dụng py -3.7 server.py)

Sau khi hoàn tất, máy chủ bắt đầu chạy. Để thực thi ứng dụng khách, hãy mở một cửa sổ cmd khác và nhập:

py client.py (ở đây, client.py là tên tệp của ứng dụng khách)

ĐẦU RA (MÁY CHỦ):

(KHÁCH HÀNG)

Hãy thử cùng một chương trình bằng cách giảm kích thước bộ đệm xuống 7 và xem đầu ra chúng ta nhận được là gì:

ĐẦU RA:

Như bạn có thể thấy, kết nối bị ngắt sau khi chuyển 7 byte. Nhưng đây là một vấn đề vì bạn chưa nhận được thông tin đầy đủ và kết nối bị đóng. Hãy tiếp tục giải quyết vấn đề này.

Đa phương tiện:

Để kết nối tiếp tục cho đến khi máy khách nhận được thông tin đầy đủ, bạn có thể sử dụng vòng lặp while:

THÍ DỤ:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) trong khi True: msg = s.recv (7) print (msg.decode ('utf- số 8'))

Khi bạn làm điều này, thông báo hoàn chỉnh sẽ được nhận trong 7 byte cho mỗi lần chuyển.

Nhưng lần này, như bạn có thể thấy, kết nối không bị ngắt và bạn không bao giờ biết khi nào điều đó sẽ xảy ra. Và để thêm vào điều này, điều gì sẽ xảy ra nếu bạn thực sự không biết thông điệp hoặc thông tin mà khách hàng sẽ nhận được từ máy chủ lớn đến mức nào. Trong những trường hợp như vậy, bạn thực sự có thể sử dụng đoạn mã sau ở phía máy khách:

THÍ DỤ:

complete_info = '' while True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Ở phía máy chủ, sử dụng phương thức close () như sau:

clt.close ()

Đầu ra của điều này sẽ như trong hình dưới đây:

ĐẦU RA:



Tất cả những gì khối mã trên thực hiện là kiểm tra kích thước của thông tin và in nó trong bộ đệm hai byte cùng một lúc cộng với việc đóng kết nối sau khi hoàn tất.

Chuyển các đối tượng Python:

Cho đến đây bạn mới có sở trường chuyển chuỗi. Nhưng, Lập trình Socket trong Python cũng cho phép bạn chuyển các đối tượng Python. Các đối tượng này có thể là bất cứ thứ gì như bộ, bộ, từ điển, v.v. Để đạt được điều này, bạn sẽ cần nhập mô-đun dưa chua của Python.

Mô-đun dưa muối Python:

Mô-đun dưa chua trong Python xuất hiện khi bạn thực sự đang tuần tự hóa hoặc hủy tuần tự hóa các đối tượng trong python. Hãy xem một ví dụ nhỏ,

THÍ DỤ:

import dưa chua mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

ĐẦU RA: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Như bạn có thể thấy, trong chương trình trên, ‘mylist’ được tuần tự hóa bằng cách sử dụng hàm dumps () của mô-đun dưa chua. Cũng xin lưu ý rằng đầu ra bắt đầu bằng chữ ‘b’, nghĩa là nó được chuyển đổi thành byte. Trong lập trình socket, bạn có thể triển khai mô-đun này để chuyển đối tượng trăn giữa máy khách và máy chủ.

Làm thế nào để sử dụng mô-đun pickle để chuyển các cấu trúc đối tượng python?

Khi bạn sử dụng dây dưa cùng với ổ cắm, bạn hoàn toàn có thể chuyển bất cứ thứ gì thông qua mạng. Hãy ghi lại các đối tác phía máy chủ và phía máy khách để chuyển danh sách từ máy chủ sang máy khách:

Phía máy chủ:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} yet ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # msg chúng ta muốn in sau mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Ở đây, m là một từ điển về cơ bản là một cần được gửi từ máy chủ đến máy khách. Điều này được thực hiện trước tiên bằng cách tuần tự hóa đối tượng bằng cách sử dụng dumps () và sau đó chuyển đổi nó thành byte.
Bây giờ, chúng ta hãy viết ra đối tác phía khách hàng:

Phía khách hàng:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) trong khi True: complete_info = b '' rec_msg = True while True: mymsg = s.recv (10) if rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Đã nhận được thông tin đầy đủ') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Vòng lặp while đầu tiên sẽ giúp chúng ta theo dõi thông báo hoàn chỉnh (complete_info) cũng như thông báo đang nhận (rec_msg) bằng cách sử dụng bộ đệm. tin nhắn bằng cách đặt rec_
Sau đó, trong khi tin nhắn đang được nhận, tất cả những gì tôi đang làm là in từng bit của nó, được nhận trong bộ đệm có kích thước 10. Kích thước này có thể là bất cứ thứ gì tùy thuộc vào lựa chọn cá nhân của bạn.

Sau đó, nếu tin nhắn nhận được bằng với tin nhắn hoàn chỉnh, tôi chỉ in tin nhắn như đã nhận được thông tin đầy đủ, sau đó tôi đã hủy tuần tự tin nhắn bằng cách sử dụng load ().

Kết quả của chương trình trên như sau:

Chúng ta đến phần cuối của bài viết này về Lập trình Socket trong Python. Tôi hy vọng bạn đã hiểu rõ ràng tất cả các khái niệm.

Đảm bảo rằng bạn luyện tập nhiều nhất có thể và hoàn nguyên trải nghiệm của mình.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của blog “Lập trình Socket trong Python” này và chúng tôi sẽ liên hệ lại với bạn sớm nhất có thể.

Để có kiến ​​thức chuyên sâu về Python cùng với các ứng dụng khác nhau của nó, bạn có thể đăng ký tham gia trực tiếp với hỗ trợ 24/7 và truy cập trọn đời.