解决 问题是我假设当我告诉它读取时它立刻得到了所有数据,所以它从我的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代码)
任何帮助将不胜感激:)
答案 0 :(得分: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;
}