Как получить файл по TCP, который был отправлен с помощью метода socket.FileSend - PullRequest
8 голосов
/ 28 декабря 2011

У меня есть клиентское приложение и серверное.

Я хочу отправить файл с одного компьютера на другой, поэтому он выглядит как сокет. FileSend - это именно то, что я ищу.

Но так как нет метода FileReceive, что я должен делать на стороне сервера, чтобы получить файл? (Моя проблема в том, что файл будет иметь переменный размер и будет больше, чем любой буфер, который я могу создать в ГБ порядке ...)

Ответы [ 2 ]

12 голосов
/ 28 декабря 2011

На стороне сервера вы можете использовать TcpListener , и, как только клиент подключится, прочитайте поток кусками и сохраните его в файл:

class Program
{
    static void Main()
    {
        var listener = new TcpListener(IPAddress.Loopback, 11000);
        listener.Start();
        while (true)
        {
            using (var client = listener.AcceptTcpClient())
            using (var stream = client.GetStream())
            using (var output = File.Create("result.dat"))
            {
                Console.WriteLine("Client connected. Starting to receive the file");

                // read the file in chunks of 1KB
                var buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    output.Write(buffer, 0, bytesRead);
                }
            }
        }

    }
}

Что касается отправкиобеспокоен тем, что вы можете взглянуть на пример, приведенный в документации метода SendFile .

При этом вы также можете взглянуть на более надежное решение, которое заключается в использовании WCF.,Существуют протоколы, такие как MTOM, которые специально оптимизированы для отправки двоичных данных по HTTP.Это гораздо более надежное решение по сравнению с использованием сокетов с очень низким уровнем.Вам придется обрабатывать такие вещи, как имена файлов, предположительно метаданные, ... вещи, которые уже учтены в существующих протоколах.

1 голос
/ 28 декабря 2011

Вам необходимо использовать Socket.Receive или Socket.BeginReceive

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