位图流TCPClient到StreamSocketListener

时间:2017-01-03 02:08:40

标签: c# uwp .net-core windows-10-universal

我很欣赏一些帮助/方向,我遇到了一个问题。我希望开发一个应用程序,它可以提供从.NET程序到Windows 10 UWP(.NETCore)程序的桌面内容流。

我已按照以下逻辑将此应用程序创建为普通的Windows窗体:

客户端:

  • 用于抓取桌面的位图对象。
  • BinaryFormatter序列化位图。
  • TCPClient通过TCP发送数据。

服务器:

  • TCPListener接收数据。
  • 使用BinaryFormatter对流进行反序列化。
  • 位图显示在图像框中。

我想将服务器端重新创建为UWP。我已经成功使用StreamSocketListener实现了一个成功的TCP连接,但是我似乎并不了解如何在UWP中替换BinaryFormatter。我目前的方法是使用DataReader读取字节流,但我似乎无法掌握接收完整位图图像的概念,因此我可以重新组装它。任何有关这方面的提示将不胜感激。我已在下面添加了客户端/服务器代码段:

客户端:

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());

    }

如果这是一个直截了当的问题我很抱歉,我已尽力遵循文档并针对类似问题进行了广泛搜索,但我没有遇到过这个问题。所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分: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的原因是因为它就像合同一样。 “如果我发送这些数据,我应该将其作为回应”。然后当某些东西破坏协议时,您可以允许连接持续存在,并希望下次它会遵循协议。或者,您可以终止连接。

我建议的另一件事是使用专用的sendreceive方法。如果您需要使用套接字发送除位图之外的其他内容。

希望这有帮助!