Ví dụ máy khách ổ cắm Python

Chào mừng bạn đến với hướng dẫn về ổ cắm với Python 3. Chúng tôi có rất nhiều thứ để trang trải, vì vậy hãy bắt đầu ngay. Thư viện

s.listen[5]
4 là một phần của thư viện chuẩn, vì vậy bạn đã có nó

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]

Biến

s.listen[5]
5 là ổ cắm TCP/IP của chúng tôi. AF_INET liên quan đến họ hoặc miền, nó có nghĩa là ipv4, trái ngược với ipv6 với AF_INET6. SOCK_STREAM có nghĩa là nó sẽ là một ổ cắm TCP, đây là loại ổ cắm của chúng tôi. TCP có nghĩa là nó sẽ được định hướng kết nối, trái ngược với không kết nối

Được rồi, vậy ổ cắm là gì?

Một ổ cắm sẽ được gắn với một số cổng trên một số máy chủ. Nói chung, bạn sẽ có loại thực thể hoặc chương trình máy khách hoặc máy chủ

Trong trường hợp của

s.listen[5]
6, bạn sẽ liên kết một ổ cắm với một số cổng trên máy chủ [localhost]. Trong trường hợp của một
s.listen[5]
7, bạn sẽ kết nối một ổ cắm với máy chủ đó, trên cùng một cổng mà mã phía máy chủ đang sử dụng

Hãy tạo mã này cho đến nay phía máy chủ của chúng tôi

s.bind[[socket.gethostname[], 1234]]

Đối với ổ cắm IP, địa chỉ mà chúng tôi liên kết là một bộ tên máy chủ và số cổng

Bây giờ chúng ta đã hoàn thành việc đó, hãy lắng nghe các kết nối đến. Chúng tôi chỉ có thể xử lý một kết nối tại một thời điểm nhất định, vì vậy chúng tôi muốn cho phép một số loại hàng đợi, chỉ trong trường hợp chúng tôi gặp sự cố nhẹ. Nếu ai đó cố gắng kết nối khi hàng đợi đã đầy, họ sẽ bị từ chối

Hãy xếp hàng 5 người

s.listen[5]

Và bây giờ, chúng ta chỉ lắng nghe

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]

Mã đầy đủ cho

s.listen[5]
8

import socket

s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s.bind[[socket.gethostname[], 1234]]
s.listen[5]

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]

Bây giờ chúng ta cần tạo mã của khách hàng

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
0

Bây giờ, vì đây là khách hàng, chứ không phải là

s.listen[5]
9, chúng ta sẽ chuyển sang
while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
0

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
3

Theo nghĩa truyền thống hơn về máy khách và máy chủ, bạn sẽ không thực sự có máy khách và máy chủ trên cùng một máy. Nếu bạn muốn có hai chương trình nói chuyện với nhau cục bộ, bạn có thể làm điều này, nhưng thông thường, máy khách của bạn sẽ có nhiều khả năng kết nối với một số máy chủ bên ngoài, sử dụng địa chỉ IP công cộng của nó, không phải

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
1. Thay vào đó, bạn sẽ chuyển chuỗi IP

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 đầy đủ cho đến thời điểm này

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
6

Được rồi, bây giờ chúng tôi chỉ chạy cả hai. Đầu tiên, hãy chạy máy chủ của chúng tôi

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
3

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
4

Trên máy chủ của chúng tôi, chúng ta sẽ thấy

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
9

Tuy nhiên, khách hàng của chúng tôi chỉ thoát sau đó vì nó đã hoàn thành công việc của mình

Vì vậy, chúng tôi đã tạo kết nối và điều đó thật tuyệt, nhưng chúng tôi thực sự muốn gửi tin nhắn và/hoặc dữ liệu qua lại. làm sao chúng ta làm việc đó bây giờ?

Ổ cắm của chúng tôi có thể dữ liệu

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
5 và
while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
6. Những phương pháp xử lý dữ liệu xử lý trong bộ đệm. Bộ đệm xảy ra trong khối dữ liệu có kích thước cố định. Hãy xem điều đó trong hành động

Bên trong

s.listen[5]
8, hãy thêm

s.listen[5]
3

Vào vòng lặp

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
8 của chúng tôi, vì vậy mã đầy đủ của chúng tôi cho
s.listen[5]
8 trở thành

s.bind[[socket.gethostname[], 1234]]
0

Vì vậy, chúng tôi đã gửi một số dữ liệu, bây giờ chúng tôi muốn nhận nó. Vì vậy, trong

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 của chúng tôi, chúng tôi sẽ làm

s.bind[[socket.gethostname[], 1234]]
1

Điều này có nghĩa là ổ cắm của chúng tôi sẽ cố gắng nhận dữ liệu, với kích thước bộ đệm là 1024 byte mỗi lần

Sau đó, hãy làm điều gì đó cơ bản với dữ liệu chúng tôi nhận được, chẳng hạn như in nó ra

s.bind[[socket.gethostname[], 1234]]
2

Thật tuyệt, mã

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 đầy đủ của chúng tôi hiện đã có

s.bind[[socket.gethostname[], 1234]]
3

Bây giờ, hãy chạy cả

s.listen[5]
8 và sau đó là
while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2. Chương trình
s.listen[5]
8 của chúng tôi

s.bind[[socket.gethostname[], 1234]]
4

Trong khi

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 của chúng tôi hiện đang hiển thị

s.bind[[socket.gethostname[], 1234]]
5

Và nó thoát. Được rồi, vậy hãy điều chỉnh bộ đệm đó một chút, thay đổi

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2
while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
6 thành 8 byte mỗi lần

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2

s.bind[[socket.gethostname[], 1234]]
6

Bây giờ, chạy lại

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2, và thay vào đó, bạn sẽ thấy một cái gì đó giống như

s.bind[[socket.gethostname[], 1234]]
7

Không trông thật nóng bỏng. Vì vậy, bạn có thể nhận ra rằng thêm tối đa 8 ký tự theo nghĩa đen, vì vậy mỗi byte là một ký tự. Tại sao không. quay lại 1024? . Tại sao lại làm việc trong bộ đệm?

Tại một số thời điểm, bất kể bạn đặt số lượng nào, nhiều ứng dụng sử dụng ổ cắm cuối cùng sẽ muốn gửi một lượng byte vượt xa kích thước bộ đệm. Thay vào đó, có lẽ chúng ta cần xây dựng chương trình của mình từ đầu để thực sự chấp nhận toàn bộ thông báo trong các đoạn của bộ đệm, ngay cả khi thường chỉ có một đoạn. Chúng tôi làm điều này chủ yếu để quản lý bộ nhớ. Các tính toán tùy thuộc vào ứng dụng có thể khác nhau và bạn có thể tự do chơi với kích thước bộ đệm sau này. Điều duy nhất tôi có thể chắc chắn hứa là. bạn cần lập kế hoạch ngay từ đầu để xử lý các giao tiếp theo khối

Đối với khách hàng của chúng tôi, làm thế nào chúng tôi có thể làm điều này? . Dữ liệu sẽ đến dưới dạng luồng, vì vậy, thực sự, việc xử lý việc này đơn giản như thay đổi tệp

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 của chúng tôi thành

s.bind[[socket.gethostname[], 1234]]
8

Vì vậy, hiện tại, chúng tôi sẽ nhận dữ liệu này và in nó thành từng khối. Nếu chúng ta chạy

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 bây giờ, chúng ta sẽ thấy

s.bind[[socket.gethostname[], 1234]]
9

Bạn cũng nên lưu ý rằng ________ 72 của chúng tôi không còn tồn tại. Kết nối này hiện vẫn mở. Điều này là do vòng lặp

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
8 của chúng tôi. Chúng tôi có thể sử dụng
import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
05 trên một ổ cắm để đóng nó nếu muốn. Chúng tôi có thể làm điều này trên máy chủ hoặc trên máy khách. hoặc cả hai. Có lẽ nên chuẩn bị cho trường hợp kết nối bị ngắt hoặc bị đóng vì bất kỳ lý do gì. Ví dụ: chúng tôi có thể đóng kết nối sau khi gửi tin nhắn của mình trên máy chủ

s.listen[5]
8

s.listen[5]
0

Tuy nhiên, nếu chúng tôi chạy cái này, chúng tôi sẽ thấy

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2 của chúng tôi sau đó gửi thư rác ra một loạt hư vô, bởi vì dữ liệu mà nó nhận được, không có gì. Nó trống rỗng. 0 byte, nhưng chúng tôi vẫn yêu cầu nó in ra những gì nó nhận được, ngay cả khi không có gì. Chúng tôi có thể khắc phục điều đó

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2

s.listen[5]
1

Vì vậy, bây giờ chúng tôi đang xem qua toàn bộ thông báo. Khi chúng tôi kết thúc, điều mà chúng tôi đang chú ý bằng cách nhận 0 byte, chúng tôi sẽ ngắt và sau đó trả lại tin nhắn. Điều này sau đó kết thúc

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2. Bây giờ, khách hàng có thể muốn duy trì kết nối. Làm thế nào chúng ta có thể làm điều đó?

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2

s.listen[5]
2

Tất nhiên, có lẽ một lần nữa chúng ta nên đảm bảo rằng

import socket

# create the socket
# AF_INET == ipv4
# SOCK_STREAM == TCP
s = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
32 có nội dung gì đó trước khi chúng ta in nó ra

while True:
    # now our endpoint knows about the OTHER endpoint.
    clientsocket, address = s.accept[]
    print[f"Connection from {address} has been established."]
2

s.listen[5]
3

Điều này hoạt động, nhưng chúng tôi có vấn đề. Điều gì xảy ra khi chúng tôi ngừng đóng ổ cắm máy khách ở phía máy chủ? . Tại sao lại thế này?

TCP là một giao tiếp *stream*. vậy làm thế nào để chúng ta thực sự biết khi nào một tin nhắn đang thực sự xảy ra? . Có nhiều cách để chúng ta có thể làm điều này. Một cách phổ biến là sử dụng một loại tiêu đề luôn dẫn đầu thông điệp của chúng tôi. Chúng tôi cũng có thể sử dụng một số loại chân trang, nhưng điều này có thể gây rắc rối nếu ai đó tìm hiểu về phương pháp của chúng tôi

Lập trình ổ cắm máy khách/máy chủ trong Python là gì?

Máy khách Python Socket . Sự khác biệt chính giữa chương trình máy chủ và máy khách là trong chương trình máy chủ, nó cần liên kết địa chỉ máy chủ và địa chỉ cổng với nhau. Xem mã ví dụ máy khách python socket bên dưới, nhận xét sẽ giúp bạn hiểu mã. similar to the server program, except binding. The main difference between server and client program is, in server program, it needs to bind host address and port address together. See the below python socket client example code, the comment will help you to understand the code.

Python kết nối với máy chủ và máy khách như thế nào?

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]

Chủ Đề