|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|||||||||||
Потоковая передача больших данных по TCP из Java в C#21.09.2017, 08:22. Показов 4574. Ответов 14
Добрый день,
Прошу помощи в разборе полетов: Задача: передать картинку с железки на которой установлена Linux + камера, клиент Windows. Пишу сервер на Java, захватываю картинку, все нормально и начинаю пихать подключенному клиенту. так вот, проблема такая, не все данные долетают, предположение что переполняется буффер сети. То есть клиент на C# не усваивает обработать поток. малые объемы данных пролетают без потерь. Пытался разбить пакет по 1024 байт, но после нескольких пакетов ломается... Вопрос: Может быть кто-нибудь реализовывал подобное поделитесь опытом. или может как в теории это должно быть? Код клиента на C# Кликните здесь для просмотра всего текста
Код сервера на Java Кликните здесь для просмотра всего текста
0
|
|||||||||||
| 21.09.2017, 08:22 | |
|
Ответы с готовыми решениями:
14
Потоковая передача данных Потоковая передача данных с телефона на компьютер Передача больших файлов по TCP |
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 21.09.2017, 11:03 | |
|
DaveMaks, у метода
ns.Read нужно проверять возвращаемое значение, которое представляет из себя количество реально прочитанных байт или нуль, если соединение было разорвано другой стороной. Соответственно, именно это число и нужно использовать при манипуляциях с прочитанными данными (Buffer).Добавлено через 1 минуту Свойство ns.DataAvailable указывает сколько данных содержится в буфере сокета, а не всё количество ещё не принятых данных (такой информацией сокет просто не обладает).
0
|
|
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|||||||||||
| 21.09.2017, 12:01 [ТС] | |||||||||||
|
И в правду,
Сделал клиента так
0
|
|||||||||||
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 21.09.2017, 12:21 | |
|
DaveMaks, в строке №11 клиента вы снова забыли проверить что возвращает
ns.Read(), а в №21 забыли, что Buffer может содержать меньше данных, чем надо. И конкатенация строк в цикле - фу-фу-фу. Используйте StringBuilder.Добавлено через 1 минуту Кстати, слабо вычислить Int32 из четырёх байт не прибегая к Array.Reverse и BitConverter.ToInt32?
1
|
|
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|
| 21.09.2017, 12:24 [ТС] | |
|
Да, я тут с Вами согласен, это все решится, и оптимизируется, вопрос был принять все куски данных. и понять алгоритм как это за пилить)
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|
| 21.09.2017, 12:25 | |
|
А зачем картинку преобразовывать в строку, а потом строку обратно в байты при отправке? Почему нельзя отправлять байты напрямую? Почему не использовать BinaryReader при получении данных?
0
|
|
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 21.09.2017, 12:26 | |
|
DaveMaks, в строке №21 ошибка, а не задел для оптимизации. Это игнорировать нельзя.
0
|
|
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|||||||||||
| 22.09.2017, 08:22 [ТС] | |||||||||||
|
Как то так вот получилось и даже работает
![]()
Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 22.09.2017, 08:57 | |
|
DaveMaks, в C# переменные типа Int инициализировать нулём не нужно, это за вас делает CLR.
ns.Read принимающее размер данных вы всё ещё не проверяете на количество реально принятых данных. Обнулять содержимое буфера на каждой итерации нет нужды. Условие if (!(tmp<0)) некорректно. Нет проверки условия выхода из цикла.Добавлено через 9 минут Про инициализацию я фигню написал.
0
|
|
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
||||||
| 22.09.2017, 09:42 [ТС] | ||||||
|
Убрал строку стало намного быстрее )
0
|
||||||
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 22.09.2017, 09:52 | |
|
DaveMaks, а где проверка на переполнение буфера
Package? И buffer нулями забивать не надо - его содержимое всё равно будет переписано на следующей итерации. Вам нет необходимости всё прогонять через один буфер и копировать данные в другой. Метод Read имеет перегрузку (которую вы и используете), которая позволяет записывать данные в определённый участок буфера. Пользуйтесь этим.
0
|
|
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|||
| 22.09.2017, 10:00 [ТС] | |||
0
|
|||
|
14135 / 9355 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
|
|
| 22.09.2017, 10:07 | |
|
DaveMaks, ничего он не забивает, так как вы используете из этого буфера ровно столько, сколько пришло. Поэтому вам должно быть всё равно, что в нём осталось от прошлой итерации.
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||||||||||||||||
| 22.09.2017, 11:44 | ||||||||||||||||
|
Вот эту жесть
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 21.09.2017
Сообщений: 12
|
|||||||||||
| 22.09.2017, 16:28 [ТС] | |||||||||||
|
Вообщем перепилил, все работает без потерь, чуть изменил формат пакета. Спасибо большое за наставление на путь истинный
![]() Кликните здесь для просмотра всего текста
Сервер Кликните здесь для просмотра всего текста
0
|
|||||||||||
| 22.09.2017, 16:28 | |
|
Помогаю со студенческими работами здесь
15
СС1101 и "Потоковая" передача данных. Есть проблема Передача больших объемов информации по TCP
Передача больших файлов tcp. Клиент зависает
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|