Python обучение сетевому программированию

искусственный интеллект Python сервер

Учебный каталог Python

  1. Использование Python3 под Mac
  2. Типы данных для изучения Python
  3. Функция обучения Python
  4. Расширенные возможности обучения Python
  5. Функциональное программирование для изучения Python
  6. Модуль обучения Python
  7. Объектно-ориентированное программирование для изучения Python
  8. Расширенное объектно-ориентированное программирование для изучения Python
  9. Отладка ошибок и тестирование обучения Python
  10. Программирование ввода-вывода для изучения Python
  11. Процесс обучения Python и поток
  12. Регулярность изучения Python
  13. Общие модули для изучения Python
  14. 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()метод.