c#流数据读取不正确

本文关键字:不正确 读取 数据 | 更新日期: 2023-09-27 18:00:09

已解决问题是,当我告诉它读取时,我假设它一次获得了所有数据,所以它从我的read SCREENSHOT方法中逃脱,并将数据包转储到我的数据包解析器中,然后用垃圾>向我的控制台发送垃圾邮件<

谢谢jon。

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

我目前使用的代码是:

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

DataHandler链接到TCP流

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

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

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

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

尾注

(客户端)

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代码)

如有任何帮助,我们将不胜感激:)

c#流数据读取不正确

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

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;
}