Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Giao diện mạng cấp thấp trong Python (socket)


Mô-đun socket trong thư viện chuẩn của Python định nghĩa cách máy chủ và máy khách giao tiếp bằng các điểm cuối socket trên hệ điều hành. API socket chứa các hàm cho cả giao thức hướng kết nối và không hướng kết nối.

Socket là điểm cuối của một liên kết giao tiếp hai chiều. Nó được đặc trưng bởi địa chỉ IP và số cổng. Cấu hình đúng các socket ở cả hai đầu là cần thiết để khởi tạo kết nối. Điều này giúp lắng nghe tin nhắn đến và gửi phản hồi trong môi trường client-server.

Hàm socket() trong mô-đun socket thiết lập một đối tượng socket.

import socket
obj = socket.socket(family, type, protocol)

Đối số family mặc định là AF_INET. Các giá trị khác chấp nhận được: AF_INET6, AF_UNIX, AF_CAN hoặc AF_RDS. Giá trị của đối số type mặc định là SOCK_STREAM chỉ ra giao thức hướng kết nối (TCP). Đối với giao thức không hướng kết nối (UDP), đặt thành SOCK_DGRAM. Đối số protocol thường được đặt thành 0 theo mặc định.

Các đối tượng socket trên máy chủ và máy khách được gọi lần lượt là server socket và client socket. Đối tượng socket thực hiện các phương thức sau:

bind()Phương thức này gán socket với địa chỉ IP và số cổng được chỉ định.
listen()Phương thức này khởi động máy chủ và chạy vào vòng lặp lắng nghe để tìm yêu cầu kết nối từ máy khách.
accept()Khi yêu cầu kết nối bị chặn bởi máy chủ, phương thức này chấp nhận nó và xác định socket máy khách với địa chỉ của nó.

Mã phía máy chủ điển hình sẽ như sau:

import socket
ss = socket.socket()
ss.bind(('localhost', 12345))
ss.listen()
client, addr = ss.accept()
print("connection request from: " + str(addr))

Nếu máy cục bộ được dùng làm máy chủ để lắng nghe tin nhắn đến từ cùng một máy làm máy khách, địa chỉ IP của nó là 127.0.0.1 còn gọi là địa chỉ loopback. Nó được xác định bằng tên máy chủ localhost. Socket được làm lắng nghe tại một số cổng trống tùy ý. Đối với giao tiếp giữa các máy cách xa trong mạng, phải sử dụng địa chỉ IP thực tế.

Socket máy khách gửi yêu cầu kết nối đến socket máy chủ đang lắng nghe tại địa chỉ IP và số cổng của nó.

connect()

obj = socket.socket()
obj.connect((host, port))

Khi yêu cầu kết nối từ máy khách được chấp nhận bởi máy chủ, cả hai đối tượng socket hiện được kết nối bằng giao thức TCP và chúng có thể gửi và/hoặc nhận dữ liệu.

send()

Máy chủ gửi dữ liệu đến máy khách bằng cách sử dụng địa chỉ mà nó đã chặn.

client.send(bytes)

Socket máy khách gửi dữ liệu đến socket mà nó đã thiết lập kết nối.

obj.send(bytes)

sendall()

Tương tự như send(). Phương thức này tiếp tục gửi dữ liệu cho đến khi tất cả dữ liệu đã được gửi.

sendto()

Phương thức này chỉ được sử dụng trong trường hợp giao thức UDP.

recv()

Phương thức này dùng để truy xuất dữ liệu được gửi đến máy khách. Trong trường hợp máy chủ, nó sử dụng socket từ xa mà yêu cầu của nó đã được chấp nhận.

client.recv(bytes)

Trong trường hợp máy khách:

obj.recv(bytes)

recvfrom()

Phương thức này được sử dụng trong trường hợp giao thức UDP.

Mã máy chủ

import socket
host = "127.0.0.1"
port = 12345
ss = socket.socket()
ss.bind((host, port))
ss.listen()
cs, addr = ss.accept()
print("Connection from: " + str(addr))
while True:
    data = cs.recv(1024).decode()
    if not data:
        break
    print("from connected user: " + str(data))
    print("Received from User: " + str(data))
    data = input("type message: ")
    cs.send(data.encode())
cs.close()

Mã máy khách

import socket
host = '127.0.0.1'
port = 12345
obj = socket.socket()
obj.connect((host, port))
message = input("type message: ")
while message != 'q':
    obj.send(message.encode())
    data = obj.recv(1024).decode()
    print('Received from server: ' + data)
    message = input("type message: ")
obj.close()

Mở hai cửa sổ dòng lệnh. Trong một cửa sổ chạy mã máy chủ trước. Sau đó trong cửa sổ kia chạy mã máy khách.

Giao diện mạng cấp thấp trong Python (socket)