Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中通过TCP/IP发送大文件(500MB-1GB)?_C#_Sockets_Tcpclient - Fatal编程技术网

如何在c#中通过TCP/IP发送大文件(500MB-1GB)?

如何在c#中通过TCP/IP发送大文件(500MB-1GB)?,c#,sockets,tcpclient,C#,Sockets,Tcpclient,我使用下面的代码将示例数据发送到字节流中,并且工作得非常好 使用的代码 客户端 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class Program { static void Main(string[] args

我使用下面的代码将示例数据发送到字节流中,并且工作得非常好

使用的代码

客户端

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        TcpClient tcpClient = new TcpClient("localHost", 5200);

        NetworkStream networkStream = tcpClient.GetStream();
        BufferedStream bs = new BufferedStream(networkStream);


        //Send data to listener
        byte[] dataToSend = new byte[100];
        new Random().NextBytes(dataToSend);
        for (int i = 0; i < 100; i++)
            networkStream.Write(dataToSend, 0, dataToSend.Length);

        //when the network stream is closed, it also shuts down the connection
        networkStream.Close();

        Console.WriteLine("Done");
        Console.ReadLine();
    }

}
我不知道如何从一个文件中发送数据,这个文件可以是非常大的大小

我尝试了下面的代码,但如果文件大小为30MB或更大,则无法工作

public void SendTCP(string filePath, string IPA, Int32 PortN)
    {
        byte[] SendingBuffer = null;
        TcpClient client = null;
        lblStatus.Text = "";
        NetworkStream netstream = null;
        try
        {
            client = new TcpClient(IPA, PortN);
            lblStatus.Text = "Connected to the Server...\n";
            netstream = client.GetStream();
            FileStream Fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            int NoOfPackets = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(Fs.Length) / Convert.ToDouble(BufferSize)));
            progressBar1.Maximum = NoOfPackets;
            int TotalLength = (int)Fs.Length, CurrentPacketLength, counter = 0;
            for (int i = 0; i < NoOfPackets; i++)
            {
                if (TotalLength > BufferSize)
                {
                    CurrentPacketLength = BufferSize;
                    TotalLength = TotalLength - CurrentPacketLength;
                }
                else
                    CurrentPacketLength = TotalLength;
                SendingBuffer = new byte[CurrentPacketLength];
                Fs.Read(SendingBuffer, 0, CurrentPacketLength);
                netstream.Write(SendingBuffer, 0, (int)SendingBuffer.Length);
                if (progressBar1.Value >= progressBar1.Maximum)
                    progressBar1.Value = progressBar1.Minimum;
                progressBar1.PerformStep();
            }

            lblStatus.Text = lblStatus.Text + "Sent " + Fs.Length.ToString() + " bytes to the server";
            Fs.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            netstream.Close();
            client.Close();

        }
    }
public void SendTCP(字符串文件路径、字符串IPA、Int32端口)
{
字节[]SendingBuffer=null;
TcpClient client=null;
lblStatus.Text=“”;
NetworkStream netstream=null;
尝试
{
客户端=新的TCP客户端(IPA、端口号);
lblStatus.Text=“已连接到服务器…\n”;
netstream=client.GetStream();
FileStream Fs=newfilestream(filePath,FileMode.Open,FileAccess.Read);
int NoOfPackets=Convert.ToInt32(数学上限(Convert.ToDouble(Fs.Length)/Convert.ToDouble(BufferSize));
progressBar1.最大值=无包装;
int TotalLength=(int)Fs.Length,CurrentPacketLength,counter=0;
for(int i=0;i缓冲区大小)
{
CurrentPacketLength=缓冲区大小;
TotalLength=TotalLength-当前包装长度;
}
其他的
CurrentPacketLength=总长度;
SendingBuffer=新字节[CurrentPacketLength];
Fs.Read(发送缓冲区,0,CurrentPacketLength);
netstream.Write(SendingBuffer,0,(int)SendingBuffer.Length);
如果(progressBar1.Value>=progressBar1.Maximum)
progressBar1.值=progressBar1.最小值;
progressBar1.PerformStep();
}
lblStatus.Text=lblStatus.Text+“发送”+Fs.Length.ToString()+“发送到服务器的字节”;
Fs.Close();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
最后
{
netstream.Close();
client.Close();
}
}

应该很简单:

// Pass a file and send it through a socket.
static async Task SendFile(FileInfo file, Socket socket)
{
    using (var networkStream = new BufferedStream(new NetworkStream(socket, false)))
    using (var fileStream = file.OpenRead())
    {
        await fileStream.CopyToAsync(networkStream);
        await networkStream.FlushAsync();
    }
}

// Pass a socket and read the content to copy it to a file.
static async Task ReceiveFile(Socket socket, FileInfo file)
{
    using (var fileStream = file.OpenWrite())
    using (var networkStream = new NetworkStream(socket, false))
    {
        await networkStream.CopyToAsync(fileStream);
    }
}
如果需要报告进度,可以使用缓冲区并报告复制的字节数:

static async Task SendFile(FileInfo file, Socket socket)
{
    var readed = -1;
    var buffer = new Byte[4096];
    using (var networkStream = new BufferedStream(new NetworkStream(socket, false)))
    using (var fileStream = file.OpenRead())
    {
        while(readed != 0)
        {
            readed = fileStream.Read(buffer, 0, buffer.Length);
            networkStream.Write(buffer, 0, readed);
            Console.WriteLine("Copied " + readed);
        }
        await networkStream.FlushAsync();
    }
}

static async Task ReceiveFile(Socket socket, FileInfo file)
{
    var readed = -1;
    var buffer = new Byte[4096];
    using (var fileStream = file.OpenWrite())
    using (var networkStream = new NetworkStream(socket, false))
    {
        while (readed != 0)
        {
            readed = networkStream.Read(buffer, 0, buffer.Length);
            fileStream.Write(buffer, 0, readed);
            Console.WriteLine("Copied " + readed);
        }
    }
}

那你知道什么?应用它有什么问题?你知道如何读取文件吗?打开
FileStream
,例如使用
file.OpenRead
。调用
inputFile.CopyTo(networkStream)
。。。就这样。问这个问题之前你试了什么?还不清楚真正的问题是什么。@JonSkeet:请检查我的更新问题。我已经添加了我的代码there@nvoigt:请检查更新的问题最后部分“不工作”是什么意思?不编译?运行时错误?例外情况?挂断?有什么东西被发送了还是什么都没有?
static async Task SendFile(FileInfo file, Socket socket)
{
    var readed = -1;
    var buffer = new Byte[4096];
    using (var networkStream = new BufferedStream(new NetworkStream(socket, false)))
    using (var fileStream = file.OpenRead())
    {
        while(readed != 0)
        {
            readed = fileStream.Read(buffer, 0, buffer.Length);
            networkStream.Write(buffer, 0, readed);
            Console.WriteLine("Copied " + readed);
        }
        await networkStream.FlushAsync();
    }
}

static async Task ReceiveFile(Socket socket, FileInfo file)
{
    var readed = -1;
    var buffer = new Byte[4096];
    using (var fileStream = file.OpenWrite())
    using (var networkStream = new NetworkStream(socket, false))
    {
        while (readed != 0)
        {
            readed = networkStream.Read(buffer, 0, buffer.Length);
            fileStream.Write(buffer, 0, readed);
            Console.WriteLine("Copied " + readed);
        }
    }
}