Никаких черт для UdpSocket токио, но да для TcpStream токио?

#rust #rust-tokio #tokio

Вопрос:

TcpStream Tokio имеет

pub fn into_split(self) -> (OwnedReadHalf, OwnedWriteHalf)

метод, который возвращает этот кортеж, где каждый элемент реализует AsyncWrite и AsyncRead . Таким образом, я могу создать HTTP-клиент, который принимает вещи, реализующие AsyncWrite и AsyncRead .

Я не смог найти подобной концепции для UdpSocket. Итак, если я пишу библиотеку, использующую tokio UdpSocket , то я не могу принять другие реализации UdpSocket , потому что это не черта.

Я чего-то не понимаю? Я бы хотел, чтобы мой клиент использовал UdpSocket , но и пользователи могли бы предоставить свои собственные реализации асинхронного UdpSocket

Ответ №1:

UDP-рамка-это то, что вам нужно, из tokio_util ящика.

Унифицированный интерфейс потока и приемника для базового UdpSocket, использующий функции кодера и декодера для кодирования и декодирования кадров.

Более уместно для вас:

Если вы хотите более непосредственно работать с потоками и приемником, рассмотрите возможность вызова split для UDP-фреймов, возвращаемых этим методом, что позволит разбить их на отдельные объекты, что позволит им легче взаимодействовать.

Похоже Sink , что половина наследуется AsyncWrite бесплатно (согласно документам tokio), но для превращения Stream половины в AsyncRead требуется использовать другую tokio-util структуру: StreamReader

Преобразуйте поток байтовых фрагментов в AsyncRead.