Понимание сокетов Python и базовое взаимодействие
Давайте начнем с понимания того, что такое сокеты и как они функционируют в Python.
Что такое сокет?
Сокет (socket) – это конечная точка для отправки и получения данных по сети. Думайте об этом как о виртуальной точке соединения, через которую проходит сетевое взаимодействие. Встроенный модуль socket Python предоставляет инструменты для создания, настройки и использования сокетов для сетевого взаимодействия.
Основной поток взаимодействия сокетов
Взаимодействие сокетов обычно следует этим шагам:
- Создать объект сокета
- Привязать сокет к адресу (для серверов)
- Прослушивать входящие соединения (для серверов)
- Принять соединения (для серверов) или подключиться к серверу (для клиентов)
- Отправлять и получать данные
- Закрыть сокет по завершении
Давайте создадим нашу первую простую программу с сокетами, чтобы лучше понять эти концепции.
Создание вашего первого сокет-сервера
Сначала давайте создадим базовый сокет-сервер, который прослушивает соединения и возвращает любые полученные данные.
Откройте WebIDE и создайте новый файл с именем server.py в каталоге /home/labex/project со следующим содержимым:
import socket
## Define server address and port
HOST = '127.0.0.1' ## Standard loopback interface address (localhost)
PORT = 65432 ## Port to listen on (non-privileged ports are > 1023)
## Create a socket object
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Bind the socket to the specified address and port
server_socket.bind((HOST, PORT))
print(f"Socket bound to {HOST}:{PORT}")
## Listen for incoming connections
server_socket.listen(1)
print(f"Socket is listening for connections")
## Accept a connection
print(f"Waiting for a connection...")
connection, client_address = server_socket.accept()
print(f"Connected to client: {client_address}")
## Receive and echo data
try:
while True:
## Receive data from the client
data = connection.recv(1024)
if not data:
## If no data is received, the client has disconnected
print(f"Client disconnected")
break
print(f"Received: {data.decode('utf-8')}")
## Echo the data back to the client
connection.sendall(data)
print(f"Sent: {data.decode('utf-8')}")
finally:
## Clean up the connection
connection.close()
server_socket.close()
print(f"Socket closed")
Создание вашего первого сокет-клиента
Теперь давайте создадим клиент для подключения к нашему серверу. Создайте новый файл с именем client.py в том же каталоге со следующим содержимым:
import socket
## Define server address and port
HOST = '127.0.0.1' ## The server's hostname or IP address
PORT = 65432 ## The port used by the server
## Create a socket object
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Connect to the server
client_socket.connect((HOST, PORT))
print(f"Connected to server at {HOST}:{PORT}")
## Send and receive data
try:
## Send data to the server
message = "Hello, Server!"
client_socket.sendall(message.encode('utf-8'))
print(f"Sent: {message}")
## Receive data from the server
data = client_socket.recv(1024)
print(f"Received: {data.decode('utf-8')}")
finally:
## Clean up the connection
client_socket.close()
print(f"Socket closed")
Тестирование ваших сокет-программ
Теперь давайте протестируем наши сокет-программы. Откройте два окна терминала в виртуальной машине LabEx.
В первом терминале запустите сервер:
cd ~/project
python3 server.py
Вы должны увидеть вывод, похожий на:
Socket created successfully
Socket bound to 127.0.0.1:65432
Socket is listening for connections
Waiting for a connection...
Оставьте сервер запущенным и откройте второй терминал, чтобы запустить клиент:
cd ~/project
python3 client.py
Вы должны увидеть вывод, похожий на:
Socket created successfully
Connected to server at 127.0.0.1:65432
Sent: Hello, Server!
Received: Hello, Server!
Socket closed
А в терминале сервера вы должны увидеть:
Connected to client: ('127.0.0.1', XXXXX)
Received: Hello, Server!
Sent: Hello, Server!
Client disconnected
Socket closed
Поздравляем! Вы только что создали и протестировали свое первое приложение клиент-сервер на основе сокетов в Python. Это обеспечивает основу для понимания того, как работает взаимодействие сокетов и как реализовать обработку ошибок на следующих этапах.