Computer >> Máy Tính >  >> Lập trình >> Python

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

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

Socket là một điểm cuối của 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 thích hợp của ổ cắm ở hai đầu là cần thiết để bắt đầu kết nối. Điều này giúp bạn có thể nghe tin nhắn đến và sau đó gửi phản hồi trong môi trường máy khách-máy chủ.

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ố 'gia đình' là AF_INET theo mặc định. Các giá trị khác được chấp nhận là:AF_INET6, AF_UNIX, AF_CAN hoặc AF_RDS. Giá trị của đối số 'type' theo mặc định là 'SOCK_STREAM' cho biết giao thức hướng kết nối (TCP). Đối với giao thức ít kết nối (UDP), hãy đặt nó thành 'SOCK_DGRAM'. Đối số 'giao thức' 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 lần lượt được gọi là ổ cắm máy chủ và ổ cắm máy khách. Đối tượng socket triển khai các phương thức sau

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

Mã phía máy chủ điển hình sẽ là

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 sử dụng làm máy chủ để lắng nghe các thông báo đến từ cùng một máy với máy khách, thì địa chỉ IP của nó là '127.0.0.1' còn được gọi là địa chỉ quay lại vòng lặp. Nó được xác định bằng tên máy chủ của 'localhost'. Ổ cắm được thiết kế để lắng nghe ở số cổng trống tùy ý. Để liên lạc giữa các máy ở xa trong mạng, địa chỉ IP thực phải được sử dụng.

Ổ cắm máy khách gửi yêu cầu kết nối đến ổ cắm 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))

Sau khi máy chủ chấp nhận yêu cầu kết nối từ máy khá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)

Ổ cắm máy khách gửi dữ liệu đến ổ cắm 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 pháp này chỉ được sử dụng trong trường hợp giao thức UDP.

recv ()

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

client.recv(bytes)

Trong trường hợp khách hàng,

obj.recv(bytes)

recvfrom ()

Phương pháp 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 = server.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: ")
   conn.send(data.encode())
cs.close()

Mã khách hàng

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ổ nhắc lệnh. Trong một lần chạy mã máy chủ đầu tiên. Mã khách hàng đang chạy khác.

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