Учебный каталог Python
- Использование Python3 под Mac
- Типы данных для изучения Python
- Функция обучения Python
- Расширенные возможности обучения Python
- Функциональное программирование для изучения Python
- Модуль обучения Python
- Объектно-ориентированное программирование для изучения Python
- Расширенное объектно-ориентированное программирование для изучения Python
- Отладка ошибок и тестирование обучения Python
- Программирование ввода-вывода для изучения Python
- Процесс обучения Python и поток
- Регулярность изучения Python
- Общие модули для изучения Python
- Python обучение сетевому программированию
Реализация Интернета делится на несколько слоев. Каждый этаж имеет свою функцию, и, как и в здании, каждый этаж поддерживается следующим этажом. Существуют разные модели наложения слоев, некоторые модели разделены на семь слоев, а некоторые - на четыре слоя. Я думаю, это проще объяснить, разделив Интернет на пять слоев. Нижний уровень называется «физический уровень», верхний уровень называется «прикладной уровень», а три средних уровня (снизу вверх) — «канальный уровень», «сетевой уровень» и «транспортный уровень». . Чем ниже уровень, тем ближе к оборудованию, чем выше уровень, тем ближе к пользователю.
TCP-программирование
Сокет — это абстрактная концепция сетевого программирования. Обычно мы используем Socket для обозначения «открытия сетевого канала», а чтобы открыть Socket, вам нужно знать IP-адрес и номер порта целевого компьютера, а затем указать тип протокола.
клиент
Создать сокет
# 导入socket库:
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
СоздайтеSocket
час,AF_INET
Укажите использование протокола IPv4, если вы хотите использовать более продвинутый IPv6, укажите его какAF_INET6
.SOCK_STREAM
Указывает на использование потокового TCP-протокола,Socket
Объект успешно создан, но соединение еще не установлено.
подключиться к серверу
s.connect(('www.sina.com.cn', 80))
Обратите внимание, что параметр являетсяtuple
, который содержит адрес и номер порта.
послать запрос
# 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
Соединение TCP создает двусторонний канал, и обе стороны могут отправлять данные друг другу одновременно. Однако, кто будет отправлен первым, а кто позже, и как согласовывать, должно решаться по конкретному соглашению. Например, протокол HTTP предусматривает, что клиент должен сначала отправить запрос на сервер, а сервер отправит данные клиенту после их получения.
Получить данные
# 接收数据:
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
закрыть сокет
# 接收数据:
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
сервер
Создать сокет
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Создайте сокет на основе протоколов IPv4 и TCP.
Привязать адрес прослушивания и порт
# 监听端口:
s.bind(('127.0.0.1', 9999))
s.listen(5)
print('Waiting for connection...')
listen()
Параметр, передаваемый методу, указывает максимальное количество ожидаемых подключений.
Принимать подключения клиентов
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
Каждое соединение должно создавать новый поток (или процесс) для обработки, иначе один поток не может принимать соединения от других клиентов, пока он обрабатывает соединение:
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
UDP-программирование
TCP предназначен для установления надежного соединения, и обе стороны связи могут отправлять данные в виде потока. По сравнению с TCP, UDP является протоколом без установления соединения.
При использовании протокола UDP нет необходимости устанавливать соединение, и вам нужно только знать IP-адрес и номер порта другой стороны, и вы можете отправлять пакеты данных напрямую. Однако я не знаю, можно ли до него добраться.
Хотя использование UDP для передачи данных ненадежно, его преимущество в том, что он быстрее, чем TCP.Для данных, не требующих надежного поступления, можно использовать протокол UDP.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))
При создании сокетаSOCK_DGRAM
Указывает, что тип этого сокета — UDP. Порт привязки такой же, как TCP, но не требует вызоваlisten()
метод, а напрямую получать данные от любого клиента:
print('Bind UDP on 9999...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)
recvfrom()
Метод возвращает данные, а также адрес и порт клиента, так что после того, как сервер получит данные, он напрямую вызоветsendto()
Данные могут быть отправлены клиенту с использованием UDP.
Обратите внимание, что многопоточность здесь опущена, потому что этот пример прост.
Когда клиент использует UDP, сокет на основе UDP по-прежнему создается первым, а затем нет необходимости вызыватьconnect()
, напрямую черезsendto()
Отправить данные на сервер:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()
Получить данные с сервера по-прежнему звонитьrecv()
метод.