#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.