|
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
|
|||||||||||
Проблема при передаче файлов21.02.2023, 21:50. Показов 1420. Ответов 11
Здравствуйте, передаю строку, некоторое сообщение, затем пытаюсь передать ряд файлов с клиента на сервер. Сервер в свою очередь пишет файлы в папочку и сохраняет.
Клиент:
Теперь проблема в следующем: При пересылке нескольких файлов - первый файл загружается превосходно, а следующий стопорится (при следующей итерации). Начниает приниматься - и не завершается. Или завершается, но не корректно. В любом случае происходит разрыв соединения. Ошибка. Да и даже если один файл загружаешь - он загружается, но происходит разрыв соединения. Какая-то ошибка, которую не могу увидеть. При повторном запуске программы - Фото отображается, в папочке - есть. Всё работает корректно, до тех самых пор, пока заново не попробуешь отправить фотографию. И опять повтор всего, что я написал выше. В случае загрузки нескольких фотографий или файлов - первый загрузится, второй в папке будет, но не дописан. Третий и четвёрый(если выбрать) - отсуствуют. Ошибка ВСЕГДА происходит на второй итерации. Или после первой.. Потому что и загрузив первый файл - всё равно соединение разрывается. Прошу помогите понять где в коде ошибка. Как написать передачу нескольких фалов корректно, что бы ошибка не возникала? Добавлено через 4 часа 12 минут try catch -выдаёт ошибку "Stream is not readble" на стороне сервера а на стороне клиента "Stream is not writble". Почему недоступен? первый же файл грузит!?
0
|
|||||||||||
| 21.02.2023, 21:50 | |
|
Ответы с готовыми решениями:
11
Ошибка OutOfMemoryException при передаче больших файлов Проблема с определением расширения файла при передаче от сервера клиенту Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? |
|
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
|
|
| 23.02.2023, 22:53 [ТС] | |
|
Ребята не въезжаю, помогите!
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|
| 23.02.2023, 23:13 | |
|
На последней итерации чтения можно прочитать больше чем нужно.
Например, размер файла 8200, вы прочитали 8192, и на следующей итерации еще 2048. То есть прочитали оставшиеся 8 байт, а остальные 2040 (уже от следующего файла) - непонятно куда пойдут. Добавлено через 2 минуты Свойство Connected, говорят, бесполезно. Хоть при чтении, хоть при записи. Добавлено через 1 минуту Можно просто FileStream копировать в NetworkStream при отправке, так меньше кода и надежнее. Добавлено через 2 минуты Скорее всего, вы часть второго файла пишете в первый.
2
|
|
|
Модератор
|
||
| 23.02.2023, 23:22 | ||
|
Manuelka, и не понял смысла создания BinaryWriter внутри цикла. Да, и вообще, зачем вы его создаёте.
Вы же просто массив байт пишите. Это можно писать напрямую в Stream. Добавлено через 5 минут Я забыл что так можно сделать.
1
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|||||||||||
| 23.02.2023, 23:42 | |||||||||||
|
Manuelka, вам нужно более строго отслеживать границы между файлами.
Например, добавить переменую leftToRead и декрементить ее.
И не забудьте брать в расчет байты следующего файла при следующей операции чтения. Эту процедуру чтения файла можно вынести в отдельный метод. Добавлено через 8 минут Можно обобщить все это добро в виде StreamingInfo RttStreamingInfo И примерно так читать:
И мультибайтовые числа по сети принято передавать в BigEndian порядке.
2
|
|||||||||||
|
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
|
|||||||||||||||||||||||
| 24.02.2023, 02:30 [ТС] | |||||||||||||||||||||||
|
Интересное замечание, после того как я установил:
using (BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8, true)) И точно ту же ситуацию совершил над BinaryReader (добавил кодировку и параметр "true" При отправке одного файла - проблема была ликвидирована. Можно было сколько угодно раз повторить отправку, но только по одному файлу. В случае если я пытаюсь отправить больше одного файла во второй не пишется больше вообще ничего. Файл создаётся, но он 0 байт. И ошибка изменилась. Теперь показывает одну из двух: 1. System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection. at System.IO.FileStream.ValidateReadWriteAr gs(Byte[] array, Int32 offset, Int32 count) at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count) at ManuelkaChatServer.ClientObject.Process( ) in C:\Users\Manuelka\source\repos\ChatServe r\ClientObject.cs:line 151 2. System.ArgumentOutOfRangeException: Non-negative number required. (Parameter 'count') at System.IO.FileStream.ValidateReadWriteAr gs(Byte[] array, Int32 offset, Int32 count) at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count) at ManuelkaChatServer.ClientObject.Process( ) in C:\Users\Manuelka\source\repos\ChatServe r\ClientObject.cs:line 151
И добавил изменения от IamRain. Сейчас код выглядит так:
Клиентская часть:
Добавлено через 2 минуты Я вроде так и делаю...
И только что заметил, только что заметил, выбрал 4 фотографии, и в этот раз он первую записал успешно, а остальные три залепил в один файл! Добавлено через 54 секунды однозначно что-то где-то с передачей байтов косячу. Добавлено через 14 минут Как это сделать грамотно? как-то обрывать цикл записи и начинать по новой?
0
|
|||||||||||||||||||||||
|
Модератор
|
||||||||
| 24.02.2023, 09:24 | ||||||||
nputStream.CopyTo(stream), то буфер не нужен. Всё само автоматически будет верно отправляться.Или неверно отлавливаете конец файла и длину следующего фрагмента. Для начала отладьте получение всех файлов единым куском, чтобы информация о длине фрагментов тоже записывалась. Длину файла конвертируйте в байты и записывайте в stream, а не в BinaryWriter. Расчленить полученный поток на отдельные файлы - это уже вторая проблема, которая решается гораздо проще. Главное что будет переданна вся информация. Добавлено через 6 минут Конвертирование long (длины файла) в массив байтов делайте методом BitConverter.(UInt64). Обратное конвертирование одной из перегрузок метода BitConverter.ToUInt64(....). Добавлено через 9 минут Manuelka, и я не вижу - вы отправляете имена файлов или нет? Думаю их тоже следует отправлять. Стринг имена так же следует конвертировать в массивы байт, но уже методами класса Encoding. У класса есть статические свойства с кодеками по умолчанию. Используйте какой-то из них.
1
|
||||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||
| 24.02.2023, 10:13 | ||
|
Более грамотно - пример выше есть. Вы просто сохраняете оставшиеся байты в буфер LeftData, при следующем вызове метода копируете в основной буфер.
1
|
||
|
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
|
||||||||||||||
| 05.03.2023, 14:06 [ТС] | ||||||||||||||
|
Попытался реализовать идею с полной загрузкой файлов в один массив байтов, а затем его разделением - потерпел не удачу, а так же непонятно было какой объём массива байтов мне нужно выделять под буфер для "всех файлов в один", для последующего разделения. Ведь неизвестно, вдруг пользователь решит грузить там 2 файла по 2 гига, это я должен предусмотреть как минимум 5 гигов, на этот буфер. А если фала 3? В общем на мой взгляд идея обречена на неудачу. Да и попытавшись её реализовать - я потерпел неудачу. Сложная задачка оказалась хотя казалось бы - загрузить пару файлов через TCP что может быть проще? ![]() В общем я вновь прошу помощи с реализацией данного вопроса! На данный момент серверный код выглядит так:
0
|
||||||||||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||||||||
| 05.03.2023, 15:54 | ||||||||
Как с этим работать: 1. Есть сервер Retranslator - он принимает файлы от одного или более sender-ов, и ретранслирует все эти файлы (по одному) всем подключенным Receiver-ам. 2. Sender - отправляет файлы на Retranslator (там в репо три картинки есть). 3. Receiver - просто ждет, когда Retranslator отправит файлы. Интереса ради можете запустить в таком порядке: 1. Retranslator 2. 1 или более Receiver-ов (собрать проект и сделать несколько копий папок). Чтобы увидеть, что действительно все Receiver-ы получают свои файлы. 3. Запустить Sender. Единственное что осталось сделать: - Проверить работоспособность сразу множества Sender-ов и множества Receiver-ов. - По research-ить с целью подбора оптимальных размеров системных и прикладных буферов под различные размеры файлов (вплоть до 10GB - было бы неплохо) - Проверить long-running работу Receiver-ов Уже после этот репо действительно может быть полезным. Но мне пока лень к этому возвращаться, надо еще разобраться как в markdown-е chart-ы рисовать. Добавлено через 11 минут Прием - это всегда самое сложное в сетевом программировании. И тут используется всего лишь один из подходов - length-prefixed approach, имхо, самый оптимальный. Есть еще парочка других способов: - Чуть посложнее, delimiter-based - когда заранее неизветен размер передаваемых данных/cообщений - На основе end-of-stream-indicator - когда read() операция возвращает 0, это значит, что отправляющая сторона в текущем соединении больше не будет оптравлять данных. Самый простой способ. Для заранее неизвестного размера данных. Например, в transcoding или echo протоколах используется.
1
|
||||||||
|
15 / 15 / 0
Регистрация: 30.06.2020
Сообщений: 69
|
|||
| 05.03.2023, 18:30 [ТС] | |||
и когда сообщение клиенту приходит - он его получает и у него создаётся картинка с параметром Source="IPсервера\дирректория\тот самый файлик.jpg" если формат не картинки - ссылочка создаётся, а не картинка. Вот такой вот хитрый подход я придумал)Однако идея бродкаст-пересылки файлов, если клиенты онлайн - идея прикольная, звучит аппетитно) давно думал о том, что бы лешить сервер мусора и переправлять сообщения, а так же файлики p2p(пусть моя задумка носит не более чем академический характер, однако это действительно гипотетически интересно!!!). Займусь после того, как научусь, разберусь с приёмом сообщений обязательно)
0
|
|||
| 05.03.2023, 18:30 | |
|
Помогаю со студенческими работами здесь
12
Проблема с объединением сообщений при передаче по TCP Проблема с вызовом метода PagedListPager, при передаче AjaxOptions Проблема с получением привязанных данных при передаче готового объекта Проблема при "передаче" данных в гистограму При передаче файлов по значению Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|