Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Передавать и принимать поток. Socket

#c_sharp #сокет #xaml #uwp #потоки_данных


Записываю картинку с камеры в поток:

var stream = new InMemoryRandomAccessStream();
await _mediaCapture.StartRecordToStreamAsync(encodingProfile,stream);


Задача: как-то разбить этот на байты и передать его по сокету, а на приеме снова
создать поток? Получается своего рода трансляция.

Поток необходимо шифровать и дешифровать с помощью aes. Метод шифрования реализован,
принимает массив байт. Как передать туда поток?
    


Ответы

Ответ 1



Вот такой код получается: private async Task SendStreamAsync(MediaEncodingProfile encodingProfile, MediaCapture mediaCapture) { var socket = new DatagramSocket(); var outputStream = await socket.GetOutputStreamAsync(new HostName("example.com"), "12345"); var writeOnlyStream = new WriteOnlyStreamStream(outputStream); await mediaCapture.StartRecordToStreamAsync(encodingProfile, writeOnlyStream); return new CompositeDisposable {writeOnlyStream, outputStream, socket}; } private sealed class WriteOnlyStreamStream : IRandomAccessStream { readonly IOutputStream _outputStream; public WriteOnlyStreamStream(IOutputStream outputStream) { _outputStream = outputStream; } public IInputStream GetInputStreamAt(ulong position) { throw new NotSupportedException(); //or we can return empty stream } public IOutputStream GetOutputStreamAt(ulong position) { return _outputStream; } public ulong Size { get { return 0; } set { } } public bool CanRead => false; public bool CanWrite => true; public IRandomAccessStream CloneStream() { throw new NotSupportedException(); } public ulong Position => 0; public void Seek(ulong position) { } public void Dispose() { this._outputStream.Dispose(); } public IAsyncOperationWithProgress ReadAsync(IBuffer buffer, uint count, InputStreamOptions options) { throw new NotSupportedException(); } public IAsyncOperationWithProgress WriteAsync(IBuffer buffer) { return _outputStream.WriteAsync(buffer); } public IAsyncOperation FlushAsync() { return _outputStream.FlushAsync(); } } Что здесь происходит: Создали Udp сокет (в нем пакеты будут теряться, биться, никакой целостности) Создали спец-класс обертку, чтобы пропихнуть IOutputStream внутрь MediaCapture. Здесь есть варианты, можно вместо исключений возвращать пустой IInputStream Создали IDisposable, который надо будет закрыть после всех операций (используем Reactive Extensions). Как правильнее посоветовали в вопросах, здесь лучше использовать TCP сокеты. Для клиентской части будет всё 1-в-1, только классы немного поменяются. Для серверной части надо использовать класс StreamSocketListener (он есть в uwp), с которого уже слушать какой-нибудь порт.

Комментариев нет:

Отправить комментарий