Recv Function Of Python Socket Class
flags — Supports values as specified the operating system. Multiple flags can be combined by doing a bitwise OR.
Return Value:
Returns the received data as bytes object.
Overview:
- Unlike send(), the recv() function of Python’s socket module can be used to receive data from both TCP and UDP sockets.
- The example client and server programs given here for UDP, use recv( ) at both client and the server sides.
Example – UDP Server:
# —— Example UDP based server program in Python that uses recv() function ——
# Define IP address and port number
udpSvr = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
# Bind the UDP socket to the IP address and the port number
# Receive datagrams from clients forever
# Receive incoming datagrams
udpSvr.sendto(«Datagram from Server».encode(), datagramSourceAddress);
Output:
(b’Datagram from Client’, (‘127.0.0.1’, 50559))
(b’Datagram from Client’, (‘127.0.0.1’, 57225))
Example – UDP Client:
# —— Example UDP client program in Python that uses recv() function ——
msg = «Datagram from client»;
udpClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
# Send a datagram to the UDP server
# Receive a reply from UDP server
# Print the received datagram from server
Введение в сетевое программирование. Сокеты.¶
Сокет — это программный интерфейс для обеспечения информационного обмена между процессами.
- Серверный — сокет, который принимает сообщения.
- Клиентский — сокет, который отправляет сообщения.
- Потоковые (на основе TCP, в коде обозначаются SOCK_STREAM ) — сокеты с установленным соединением на основе протокола TCP, передают поток байтов, который может быть двунаправленным — т.е. приложение может и получать и отправлять данные.
- Дейтаграммные (на основе UDP, в коде обозначаются SOCK_DGRAM ) — сокеты, не требующие установления явного соединения между ними. Сообщение отправляется указанному сокету и, соответственно, может получаться от указанного сокета.
Сокет состоит из IP-адреса и порта.
IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP. В версии протокола IPv4 IP-адрес имеет длину 4 байта (например, 192.168.0.3), а в версии протокола IPv6 IP-адрес имеет длину 16 байт (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). IP-адрес должен быть уникален.
Порт — натуральное число, записываемое в заголовках протоколов транспортного уровня (TCP, UDP и др.). Порт используется для определения процесса-получателя пакета в пределах одного хоста.
В python для работы с сокетами используется встроенная библиотека socket . Одной из основных функций модуля является функция socket() , которая возвращает объект типа сокет, обладающий соответствующими функциями для работы с соединением.:
class socket.socket sock = socket.socket()
- socket.bind(address) — Привязывает сокет к адресу address (инициализирует IP-адрес и порт). Сокет не должен быть привязан до этого.
- socket.listen([backlog]) — Переводит сервер в режим приема соединений. Параметр«backlog (int)« – количество соединений, которые будет принимать сервер.
- socket.accept() — Принимает соединение и блокирует приложение в ожидании сообщения от клиента. В результате возвращает кортеж:
- conn : объект соединения (сокет), который можно использовать для отправки/получения данных;
- address : адрес клиента.
Работа с сокетом во многом схожа с работой с файловым объектом. Принцип — открыли соединение — считали данные — закрыли соединение.
Создание серверного сокета: .. code
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # создаем сокет sock.bind(('', 55000)) # связываем сокет с портом, где он будет ожидать сообщения sock.listen(10) # указываем сколько может сокет принимать соединений print('Server is running, please, press ctrl+c to stop') while True: conn, addr = sock.accept() # начинаем принимать соединения print('connected:', addr) # выводим информацию о подключении data = conn.recv(1024) # принимаем данные от клиента, по 1024 байт print(str(data)) conn.send(data.upper()) # в ответ клиенту отправляем сообщение в верхнем регистре conn.close() # закрываем соединение
Создание клиентского сокета: .. code
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # создаем сокет sock.connect(('localhost', 55000)) # подключемся к серверному сокету sock.send(bytes('Hello, world', encoding = 'UTF-8')) # отправляем сообщение data = sock.recv(1024) # читаем ответ от серверного сокета sock.close() # закрываем соединение print(data)
Обратите внимание, клиент отправляет байтовую строку, а не обычную. Сервер так же принимает в качестве сообщения байтовую строку и должен в ответе вернуть объект того же типа.
Задания¶
- Реализовать чат без графического интерфейса, который позволит обмениваться сообщениями только между клиентом и сервером. Клиент должен получать сообщения сервера в том числе.
- С помощью модуля easygui (см. полезные ссылки), добавьте в разработанный чат простой графический интерфейс.
- Разработайте приложение, которое будет запрашивать у пользователя название файла, а затем отправлять содержимое этого файла серверу. Сервер будет подсчитывать количество слов и возвращать ответ.
- Добавьте к чату из задачи 2 чат-бота на стороне сервера. Добавьте 4-5 фраз, которые сервер будет отправлять по определённым условиям.
Полезные ссылки:¶
© Copyright Revision d00c0df4 .
Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.