Клиенту нужно было знать адрес и номер порта сервера, но он не указал свой
номер порта, поэтому тот был автоматически присвоен системой — в этом случае
он был равен 56267.
По протоколу UDP данные отправляются небольшими фрагментами. Этот протокол не га-
рантирует доставки. Если вы отправите несколько сообщений с помощью UDP, они могут
прийти в неправильном порядке или вообще не появиться. Этот протокол быстр, легок,
не создает соединений, но он ненадежен.
Что приводит нас к протоколу TCP (Transmission Control Protocol, протокол
управления передачей). TCP используется для более продолжительных соеди-
нений вроде соединений с Интернетом. TCP доставляет данные в том порядке,
в котором они были отправлены. Если возникают какие-то проблемы, он пыта-
ется отправить их снова. Обменяемся пакетами между клиентом и сервером
с помощью TCP.
Файл tcp_client.py действует так же, как и предыдущий клиент, работающий
с UDP, отправляя только одну строку на сервер. Однако существуют небольшие
различия в вызовах сокетов, показанные здесь:
import socket
from datetime import datetime
address = ('localhost', 6789)
max_size = 1000
print('Starting the client at', datetime.now())
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(address)
client.sendall(b'Hey!')
data = client.recv(max_size)
print('At', datetime.now(), 'someone replied', data)
client.close()
Мы заменили параметр SOCK_DGRAM на SOCK_STREAM, чтобы получить потоковый
протокол, TCP. Мы также добавили вызов connect(), чтобы установить поток. Нам
не нужно было делать это для UDP, поскольку каждая датаграмма после отправки
предоставлялась сама себе.
326
Глава 11. Конкуренция и сети
Файл tcp_server.py также отличается от своего собрата, работающего с UDP:
from datetime import datetime
import socket
address = ('localhost', 6789)
max_size = 1000
print('Starting the server at', datetime.now())
print('Waiting for a client to call.')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(address)
server.listen(5)
client, addr = server.accept()
data = client.recv(max_size)
print('At', datetime.now(), client, 'said', data)
client.sendall(b'Are you talking to me?')
client.close()
server.close()