通过Socket.SendFile发送大文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Socket.SendFile发送大文件相关的知识,希望对你有一定的参考价值。
我想通过C#中的套接字发送文件。我正在使用服务器和客户端。
服务器:
static void Main(string[] args)
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100));
server.Listen(0);
Socket client = server.Accept();
client.SendFile("F:\TestMovie.mp4");
server.Close();
Console.ReadKey();
}
客户:
static void Main(string[] args)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100));
byte[] buff = new byte[10048];
int index = client.Receive(buff);
if (buff.Length < index)
{
Array.Resize<byte>(ref buff, index);
}
File.WriteAllBytes("F:\TestMovie.mp4", buff);
}
我的意思是客户如何知道服务器发送的大小。
这有点简单,因为我只是用它作为测试。
但是服务器只能发送大小只有10KB左右的文件。
答案
我的意思是客户如何知道服务器发送的大小。
取决于你想要做什么。如果您之后只发送单个文件并关闭连接,则该结束意味着文件结束。你只需循环client.Receive()
直到它返回0
。一个可能更好的解决方案是依靠NetworkStream然后你可以做类似的事情
using (NetworkStream networkStream = new NetworkStream(client))
using (FileStream fileStream = File.Open("test.mp4", FileMode.OpenOrCreate))
{
networkStream.CopyTo(fileStream);
}
但这只有在服务器完成发送后关闭客户端Socket
时才能正常工作。
如果要传输多个文件,则必须使用协议进行通信,一个简单的方法是始终发送指示文件大小的int
或long
,然后让客户端读取该数据量。
另一答案
您可能遇到的是您的客户端的缓冲区已满。相反,请尝试使用流将数据写入磁盘。
注意:未经测试的代码
using(var stream = File.OpenWrite("path"))
{
byte[] buff = new byte[2048];
int read;
try
{
do
{
read = client.Receive(buff);
stream.Write(buff, 0, read);
} while(read > 0);
}
catch(SocketException)
{
// exception is thrown when the socket was closed
}
}
您可能还需要正确关闭套接字以避免使用client.Shutdown(SocketShutdown.Both);
发送部分数据
以上是关于通过Socket.SendFile发送大文件的主要内容,如果未能解决你的问题,请参考以下文章