Отправка огромных файлов через Socket.SendFile - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу отправить файл через сокеты в 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);
    }

Я имею в виду, как Клиент может узнать, сколько размер отправляет сервер.

Это довольно просто, поскольку я использовал его только в качестве теста.

Но сервер может только отправлятьфайлы размером всего около 10 КБ.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я имею в виду, как Клиент может узнать, какой размер отправляет сервер.

Зависит от того, что именно вы хотите сделать.Если вы отправляете только один файл и затем закрываете соединение, это закрытие подразумевает конец файла.Вы просто зацикливаетесь на 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, указывающий размер файла, изатем попросите клиента прочитать этот объем данных.

0 голосов
/ 21 сентября 2018

Вероятно, вы столкнулись с тем, что буфер вашего клиента заполнен.Вместо этого попробуйте использовать поток для записи данных на диск.

ПРИМЕЧАНИЕ. Непроверенный код

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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...