【问题标题】:How to receive large file over networkstream c#?如何通过网络流 C# 接收大文件?
【发布时间】:2014-01-21 13:34:26
【问题描述】:

我正在通过 TCPClient 和 TCPListener 连接 2 个设备,并且我现在只发送一个字符串,并且一切正常:

ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("Hello Server!");
clientStream.Write(buffer, 0 , buffer.Length);
clientStream.Flush();

然后

bytesRead = clientStream.Read(message, 0, 4096);
ASCIIEncoding encoder = new ASCIIEncoding();
Console.WriteLine("Mensageee"+ encoder.GetString(message, 0, bytesRead));

但现在我需要发送一个大文件,比如 10mb 或更多,所以我应该使用它吗?

 string doc = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        byte[] file = File.ReadAllBytes(doc + filedir)
        byte[] fileBuffer = new byte[file.Length];
        TcpClient clientSocket = new TcpClient(ip, port);
        NetworkStream networkStream = clientSocket.GetStream();
        networkStream.Write(file.ToArray(), 0, fileBuffer.GetLength(0));
        networkStream.Close();

我应该如何接收所有这些文件,然后将其保存在某个地方? 欢迎任何帮助谢谢o/

【问题讨论】:

  • 你为什么在byte[] 上打电话给ToArray()?目前尚不清楚您的 fileBuffer 变量是什么...networkStream.Write(file, 0, file.Length) 有什么问题?
  • 你说得对,我想我可以使用 networkStream.Write(file, 0, file.Length),这只是我发现的一个随机示例。问题是我如何通过侦听器接收这个大文件,以及如何获得关于仍然缺少多少的反馈,以便我可以更新进度条?
  • 嗯,除非你把它放在流中的某个地方,否则你无法知道未来会有多少数据......你需要考虑你的协议。例如,您是否需要能够在同一连接中发送多条消息?
  • 我需要做的就是发送一个 .zip 文件,然后关闭连接。 1 个文件 1 次,问题(我不确定它是否有问题)是这个 zip 文件可能只有 100kb 到 100mb。
  • 如果您不需要显示进度更新,您可以使用Stream.CopyTo(otherStream)

标签: c# sockets xamarin transfer


【解决方案1】:

简短的回答是,您多次发送byte[]...

基本上,您需要用文件的子集填充缓冲区('byte[]'):

int count = fileIO.Read(buffer, 0, buffer.Length);

然后通过套接字发送缓冲区:

clientSocket.Send(buffer, 0, count);

只需执行这两个过程,直到您发送了整个文件...(这将是count <= 0)但是,服务器必须知道要读取多少字节...所以我们应该从发送一个开始Int64 与文件的长度。

到目前为止我们所拥有的......

using (var fileIO = File.OpenRead(@"C:\temp\fake.bin"))
using(var clientSocket = new System.Net.Sockets.TcpClient(ip, port).GetStream())
{
  // Send Length (Int64)
  clientSocket.Write(BitConverter.GetBytes(fileIO.Length, 0, 8));

  var buffer = new byte[1024 * 8];
  int count;
  while ((count = fileIO.Read(buffer, 0, buffer.Length)) > 0)
    clientSocket.Write(buffer, 0, count);
}

服务器端

Int64 bytesReceived = 0;
int count;
var buffer = new byte[1024*8];

// Read length - Int64
clientStream.Read(buffer, 0, 8);
Int64 numberOfBytes = BitConverter.ToInt64(buffer, 0);

using(var fileIO = File.Create("@c:\some\path"))
  while(bytesReceived < numberOfBytes && (count = clientStream.Read(buffer, 0, buffer.Length)) > 0)
  {
    fileIO.Write(buffer, 0, count);
    bytesReceived += count;
  }

【讨论】:

  • 理解逻辑,我只是​​在“clientStream.Write(BitConverter.GetBytes(clientStream.Length), 0 , 8);”这一行中得到“不支持操作”
  • 这个“clientStream.Write(BitConverter.GetBytes(clientStream.Length), 0 , 8);”将如何要知道我的文件有多大,我没有得到,这条线在哪里,它会说我的文件的大小,与 tmy FileIO 连接?
  • 我的错,应该是fileIO.Length
  • 哦,我的坏 2,我无法自己修复.. 现在测试一下
  • 是的,问题是clientStream.Length,应该是fileIO.Length。我更新了答案。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2015-06-23
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多