2017-01-03 5 views
1

Я был бы признателен за помощь или помощь с проблемой, которую я испытываю. Я надеюсь разработать приложение, которое обеспечит поток моего рабочего стола из .NET-программы в программу Windows 10 UWP (.NETCore).Bitmap Stream TCPClient to StreamSocketListener

Я создал это приложение как обычная форма Windows, следуя эту логику:

Клиент:

  • объект Bitmap используется для захвата рабочего стола.
  • BinaryFormatter для сериализации растрового изображения.
  • TCPClient отправляет данные через TCP.

Сервер:

  • TcpListener принимает данные.
  • Поток десериализуется с использованием BinaryFormatter.
  • Растровое изображение представлено в изображении.

Я хотел бы воссоздать серверную часть вещей как UWP. Мне удалось добиться успешного TCP-соединения с помощью StreamSocketListener без проблем, но я, похоже, не понимаю, как заменить BinaryFormatter в UWP. Мой текущий подход заключается в использовании DataReader для чтения в потоке байтов, но я не могу понять концепцию, чтобы получить полное изображение растрового изображения, чтобы снова собрать его. Любые советы по этому поводу будут оценены. Я включил фрагменты Client/Server ниже:

Клиент:

private void SendDeskTopImageOverTCP() 
{ 
    BinaryFormatter binFormatter = new BinaryFormatter(); 
    mainStream = client.GetStream(); 

    // Get Desktop bitmap and send over TCP Stream. 
    binFormatter.Serialize(mainStream, GetDesktopBitmap()); 
} 

Сервер:

// What do we do when a connection is made? 
private async void OnConnection(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) 
{ 
    // Indicate Connection Received! 
    Debug.WriteLine("Connection Received!"); 

    // Data Stream Reader 
    DataReader reader = new DataReader(args.Socket.InputStream); 

    // Wait until one or more bytes available 
    reader.InputStreamOptions = InputStreamOptions.Partial; 

    // Load data from the input stream 
    await reader.LoadAsync(200); 

    while (reader.UnconsumedBufferLength > 0) 
    { 
     await reader.LoadAsync(200); 

     //View byte stream?? 
     Debug.WriteLine(reader.ReadByte()); 

    } 

Мои извинения, если это является прямой проблемой, я старался изо всех сил следуйте документации и искать по всему миру по аналогичной проблеме, но я не сталкивался с этим. Поэтому любая помощь будет оценена по достоинству.

+0

Это еще проблема? – czifro

ответ

1

Я бы рекомендовал разработать протокол. Протокол будет действовать как API. Например, перед отправкой растрового изображения вы отправляете размер растрового изображения. Как так:

private byte[] GetDesktopAsBytes() 
{ 
    return serialize(GetDesktopAsBitmap()); // choose some way of getting bytes 
} 

private void send(byte[] data) 
{ 
    // this should be a byte array length = sizeof(int) 
    var dataSize = System.BitConverter.GetBytes(data.Length) 

    // send dataSize first 
    // then send data 
} 

private byte[] receive() 
{ 
    var dataSizeRaw = /* receive 4 bytes from tcp conn */ ; 
    var dataSize = System.BitConverter.ToInt32(dataSizeRaw,0); 

    var data = new byte[dataSize]; 

    // use tcp conn to fill data. 

    return data; 
} 

// send(GetDesktopAsBytes()); 

Этот базовый протокол позволяет два конца, чтобы отправить вещи разных размеров и всегда отправлять/получать любой в полном объеме. С сетью вам действительно нужно подумать о данных, которые вы отправляете и получаете, и о том, как вы собираетесь обеспечить его получение от A до B целиком. Причина, по которой я сделал протокол, аналогичный API, состоит в том, что он действует как контракт. «Если я отправлю эти данные, я должен получить это как ответ». Затем, когда что-то нарушает протокол, вы можете либо разрешить соединение упорствовать, либо надеяться, что в следующий раз он будет следовать протоколу. Или вы можете завершить соединение.

Еще одна вещь, которую я рекомендую, - это посвятить send и receive методам. Если вам нужно использовать сокет для отправки чего-то другого, кроме растрового изображения.

Надеюсь, это поможет!