0

已解决 的问题是,当我告诉它读取时,我假设它立即获取了所有数据,因此它从我的 READ SCREENSHOT 方法中逃逸,并将数据包转储到我的数据包解析器中,然后继续向我的控制台发送垃圾邮件 >。 <

谢谢乔恩。

我还有另一个新问题,这次我无法弄清楚我的数据流有什么问题,我目前正在尝试将捕获的图像文件流式传输到中央网络服务器,我设置了客户端>服务器,说得很好,一整天来回传递数据,但是当我尝试调用我的屏幕截图功能并发送它时,这就是我遇到问题的地方。

我用于此的当前代码是:

注意 DataHandler 只是一个用于发送和接收数据的包装器,AddVar 是一个重载方法,它接受任何变量并通过流发送它(new DataHandler(stream))

DataHandler 链接到 TCP Stream

ReadInt 和 ReadLong 等是相反的辅助函数,有助于使代码更易于以后维护。

此时,服务器每秒向客户端发送一个 ping,客户端设置为响应该 ping,如果它不忙于响应另一个数据包(传入的数据包在单个线程上运行)

服务器遵循相同的规则,每个客户端

将数据写入 SI.TakeScreenShotAndStream 的流中,此方法获取客户端计算机的屏幕截图并将数据流式传输到任何传递的流,在本例中为 memorystream。

尾注

(客户端)

try
        {
            DataHandler.AddVariable((byte)50);
            memoryStream = new MemoryStream();
            SI.TakeScreenShotAndStream(memoryStream, quality);
            DataHandler.AddVariable(memoryStream.Length);
            memoryStream.Position = 0;
            memoryStream.CopyTo(clientStream);
            clientStream.Flush();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Disconnect();
        }

和服务器端

if (!Directory.Exists(LoadedSettings.Directory + name)) Directory.CreateDirectory(LoadedSettings.Directory + name);
            fileStream = File.Create(FullPath);
            long length = DataHandler.ReadLong();
            byte[] data = new byte[length];
            clientStream.Read(data, 0, (int)length);
            fileStream.Write(data, 0, (int)length);
            fileStream.Flush();
            fileStream.Close();

“截屏并保存”功能有效,我可以将其流式传输到 FileStream 并将其直接保存到文件中,我的问题似乎是如果我真的很远,我不知道如何使用 MemoryStream 类标记如何做到这一点,一个很好的内存流教程会很有帮助。

有一次,我试图将 MemoryStream 转换为字节数组,但这也不起作用。

另请注意,这不仅仅是搞砸了,这两者都封装在 try/catch 语句和无效数据包(除 1、2 和 50 atm 之外的任何数据包)中,当异常和无效数据包编号都记录到控制台时我运行这段代码,它向控制台喷出如此多的声音,以至于它不断发出哔哔声,直到我将其关闭(我的程序中的任何地方都没有 console.beep 代码)

任何援助将不胜感激 :)

4

1 回答 1

3

这是您在此处读取数据的方式:

clientStream.Read(data, 0, (int)length);

相反,您应该使用返回的值Read

// TODO: If you really want to handle more then 4GB per file, you'll need
// to change this...
int length = (int) DataHandler.ReadLong();
byte[] buffer = new byte[16 * 1024]; // Read up to 16K at a time

while (length > 0)
{
    int bytesRead = clientStream.Read(buffer, 0,
                                      Math.Min(length, buffer.Length));
    if (bytesRead <= 0)
    {
        // Throw an appropriate exception: the data is truncated
    }
    fileStream.Write(buffer, 0, bytesRead);
    length -= bytesRead;
}
于 2013-02-20T07:37:35.720 回答