繁体   English   中英

C#流数据无法正确读取

[英]c# Stream data not reading correctly

解决的问题是当我告诉我要读取它时,我假设它一次获得了所有数据,因此它逃避了我的READ SCREENSHOT方法并将数据包转储到我的数据包解析器中,然后继续使用垃圾>垃圾发送我的控制台。 <

谢谢乔恩。

我还有另一个新问题,这次我无法弄清楚数据流出了什么问题,我目前正在尝试将捕获的图像文件流式传输到中央网络服务器,我已经设置了“客户端”>“服务器”,说得很好,整天来回传递数据,但是当我尝试调用屏幕快照函数并将其发送时,多数民众赞成在那儿解决问题。

我为此使用的当前代码是:

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

DataHandler链接到TCP流

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

任何援助将不胜感激 :)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM