2013-02-20 62 views
-1

解决 问题是我是假设它立刻得到了所有的数据,当我告诉它来读取,所以这是逃避我的READ屏幕截图的方法和倾倒的数据打包到我的包解析器,它继续用垃圾>给我的控制台发送垃圾邮件>。 <C#流数据不读正确

谢谢jon。

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

使用该当前代码IM是:

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

的DataHandler被链接到TCP流

的readInt和ReadLong等是反向,辅助功能,以便使代码更易于以后维护。

此时服务器发送一个ping每一秒,到客户端,所述客户端被设置成到该响应ping IF它不是忙响应给另一个分组(传入分组在单个线程中运行)

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

将数据写入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之外的任何数据)中,无论是异常还是无效的数据包编号都会被记录到控制台,当我运行这个代码时,它会向控制台发出如此多的声音,它会不断地发出哔哔声,直到我将其关闭(没有控制台。在我的程序的任何地方哔声代码)

任何援助,将不胜感激:)

+0

你的代码看起来没问题。问题很可能在于你没有展示的东西。 DataHandler的?客户端 - 服务器通信? etc – 2013-02-20 07:04:19

+0

多玩一点,它可能是在尝试读取数据时,它正在传输,搞砸了,服务器上的其他东西,生病添加更多关于其他东西的详细信息 – RyanTimmons91 2013-02-20 07:07:22

+0

AHA!我注意到,在我的catch语句中,我并没有关闭套接字,所以如果它出错并且数据仍然在进入,它只会泛滥控制台,我修复了这个问题,并且我会继续使用它,并更新我的帖子 – RyanTimmons91 2013-02-20 07:16:59

回答

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

谢谢Jon!如果我在圈子里跑来跑去试图找出这一个:) – RyanTimmons91 2013-02-27 03:22:11