Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для p_r_a_g_m_a
112 / 64 / 23
Регистрация: 08.03.2012
Сообщений: 211
.NET 4.x

Передача файлов с использованием TCP Socket

05.04.2017, 23:52. Показов 2261. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Возникла проблема при попытке передать файл с помощью сокетов. Сервер обрабатывает не все отправленные на него данные (например из 26 кб получает 16 кб). Заметил одну непонятный момент: если между методом socket.Receive() и записью в MemoryStream добавить строчку кода, например записи данных в лог файл (File.AppendAllText("Log.log", string.Format("Received={0}\r\n", received)), то все работает нормально. Подскажите что я делаю не так? Заранее спасибо

Код сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
namespace TCPServer {
    class Program {
        static void Main(string[] args) {
            try {
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
 
                Socket listenSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
                listenSoc.Bind(endPoint);
                listenSoc.Listen(10);
                Console.WriteLine("Server is running...");
 
                int bytes = 0;
                const int bufferSize = 8192;
                while (true) {
                    Socket handler = listenSoc.Accept();
 
                    NetFile file;
                    using (MemoryStream memStream = new MemoryStream()) {
                        byte[] buffer = new byte[bufferSize];
                        do {
                            int received = handler.Receive(buffer);
                            //File.AppendAllText("Log.log", string.Format("Received={0}\r\n", received));
                            memStream.Write(buffer, 0, received);
                            bytes += received;
                        }
                        while (handler.Available > 0);
                        file = new NetFile(memStream.ToArray());
                    }
                    Console.WriteLine("Size of received data: " + bytes.ToString() + " bytes");
 
                    using (FileStream stream = new FileStream(file.FileName, FileMode.Create, FileAccess.Write)) {
                        stream.Write(file.Data, 0, file.Data.Length);
                    }
 
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
 
                    bytes = 0;
                }
            }
            catch (Exception error) {
                Console.WriteLine(error.ToString());
                Console.ReadKey();
            }
        }
    }
}
Код клиента:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace TcpClient {
    class Program {
        static void Main(string[] args) {
            try {
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
 
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(endPoint);
                Console.WriteLine("Client connected");
 
                Console.WriteLine("Sending file...");
                using (FileStream stream = new FileStream("c:\\1.sql", FileMode.Open, FileAccess.Read)) {
                    byte[] data = new byte[stream.Length];
                    int length = stream.Read(data, 0, data.Length);
                    NetFile file = new NetFile();
                    file.FileName = Path.GetFileName(stream.Name);
                    file.Data = data;
 
                    byte[] to = file.ToArray();
                    socket.Send(to);
                }
                Console.WriteLine("File sended");
 
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
                Console.ReadKey();
            }
            catch (Exception error) {
                Console.WriteLine(error.ToString());
                Console.ReadKey();
            }
        }
    }
}
Класс с информацией об отправляемом файле:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
namespace ExchangeEngine.Net {
 
    [Serializable]
    public class NetFile {
        private byte[] _data;
 
        public NetFile() { }
 
        public NetFile(byte[] data) {
            NetFile file = FromArray(data);
            FileName = file.FileName;
            Data = file.Data;
        }
 
        public string FileName { get; set; }
 
        public byte[] Data {
            get {
                return _data;
            }
            set {
                _data = value;
                Checksum = GetMD5Hash(_data);
            }
        }
 
        public string Checksum { get; set; }
 
        public static string GetMD5Hash(byte[] source) {
            StringBuilder hash = new StringBuilder();
            using (MD5 md5Hasher = MD5.Create()) {
                byte[] data = md5Hasher.ComputeHash(source);
                for (int index = 0; index < data.Length; index++) {
                    hash.Append(data[index].ToString("x2"));
                }
 
                return hash.ToString();
            }
        }
 
        public byte[] ToArray() {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream()) {
                formatter.Serialize(stream, this);
 
                return stream.ToArray();
            }
        }
 
        public static NetFile FromArray(byte[] data) {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream(data)) {
                stream.Position = 0;
                return (NetFile)formatter.Deserialize(stream);
            }
        }
    }
}
Добавлено через 3 часа 13 минут
Вопрос решен:
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.04.2017, 23:52
Ответы с готовыми решениями:

Передача данных через socket TCP/IP
Доброе время суток. Можете помочь в подборе какой то стоящей информации или показать/рассказать как делается данное задание (выдали на...

Передача данных по сети (TCP, Socket)
Никак не могу понять в каком именно месте ошибка. С клиента на сервер передаются данные. Сначала название будущего файла, а затем строка...

Передача файлов через Tcp/Ip Socket
Всем привет. Как возможно передавать файлы в размерах от 200-500 мб.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2017, 23:52
Помогаю со студенческими работами здесь

Передача данных по TCP IP (Socket) от устройства к девайсу по вайфай
Ищу человека который разбираеться в передаче данных по сокету для iOs устройств , либо очет научиться в этом разбираться Для Android уже...

передача файла с использованием Socket
Пишу программу для передачи файлов по сети на VS 2008 с использованием сокетов. При тестировании на одном компе все нормально, но при...

Передача файлов - Socket
как передать файл через Socket и знать количество процентов сколько приняло/передано?

TCP передача файлов
Здравствуйте, разбирался в структуре и способе работы с протоколом по передачи данных TCP, сделал сервер на С++ (Linux) так же есть клиент...

Передача больших файлов используя Socket
Помогите! Как правильно организовать передачу больших файлов используя Socket. Написал сервер using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru