У меня есть 2D динамический массив, содержащий целые числа и строки, которые мне нужно отправить на сервер. Массив состоит из 100 000 столбцов. Одна из возможностей - скопировать массив в файл и отправить его на сервер, и сервер может его проанализировать. В то время как другая возможность заключается в сериализации. Я делаю сокет-программирование в первый раз, и решение, которое я ищу, должно быть оптимальным. Учитывая размер массива, я не думаю, что преобразование каждого элемента в байты было бы хорошим. Пожалуйста, не могли бы вы дать мне небольшой намек или направить меня на то, как я должен действовать.Как отправить 2D-массив через сокет на сервер в Java
ответ
Сериализация данных в байтах для потоковой передачи по сокету или сериализация данных в файл, а отправка файла по существу такая же. Если вы сериализовываете файл, вы можете отказаться от установленного протокола, такого как FTP, который будет проще для разработчиков, новых для сокетов.
Опять же, поймите, что это по сути та же проблема. Прерывание программного объекта в байтах для записи в выходной поток.
Edit:
В зависимости от содержания ваших строк, используя алгоритм сжатия почтового является хорошим выбором. Чем больше повторяется контент в ваших строках, тем лучший коэффициент сжатия вы получите. Вот только примерный формат файла:
- Число подходов, которым нужно следовать. (Поскольку вы не указали max ROWS в вашем 2D-массиве, я не могу сказать, сколько байтов это займет. Мы будем считать его 8 байтов.)
- Все объекты. Это займет 3 * NUM_INTS байта.
- Zip сжатые строки, разделенные пробелом.
Я делаю много предположений здесь, потому что вы не были достаточно конкретны в своем вопросе или каких-либо ответах, которые вы дали.
Теперь проблема в том, о каком типе файла мы говорим? – Shahzaib
Это зависит от того, какой тип данных у вас есть. Каков диапазон ваших целых чисел? Должен ли этот файл потреблять люди? Как долго ваши строки? @Shahzaib –
Целые числа состоят из шести цифр, а строки имеют 10 символов. – Shahzaib
Я бы конвертировал его в json или xml и отправил это. Это не самые эффективные решения с точки зрения скорости, но самые портативные.
CSV тоже хорош. –
Это, кажется, хорошее предложение ... Позвольте мне подумать об этом – Shahzaib
Простым подходом было бы использовать DataOutputStream
и обернуть его вокруг сокета, который вы используете: DataOutputStream dOut = new DataOutputStream(socket.getOuputStream())
.
Вы тогда могли бы просто создать свой собственный простой двоичный протокол, как это (это для 1D массива, но он может быть легко расширен для работы 2D массивов, а):
//first write the amount of elements in the array
dOut.write(array.length());
//now write every element
for (Object obj : array) {
if (obj instanceof Integer) {
dOut.writeByte(0); //0 = Integer
dOut.writeInt((Integer) obj);
} else
if (obj instanceof String) {
dOut.writeByte(1); //1 = String
dOut.writeUTF((String) obj); //UTF-8 encoded String
}
// ...
}
Если вы хотите оптимизировать для размера данных, вы также можете использовать GZIPOutputStream
между разъемами OutputStream
и DataOutputStream
следующим образом: new DataOutputStream(new GZIPOutputStream(socket.getOutputStream()))
. Разумеется, вам нужно распаковать его на стороне сервера, чтобы это работало.
Итак, в основном мы будем анализировать каждый элемент массива и записывать его на сервер. Не будет ли это слишком много сетевого трафика? Другими словами, скорость будет уменьшаться. – Shahzaib
Это в основном то, что делает протокол сериализации. За исключением разбора какого-либо объекта и потери байта для каждого элемента, чтобы позже рассказать им обособленно, это оптимально. Если вам нужна более высокая скорость и меньше данных, я предлагаю разделить объекты и поместить их в разные массивы - поэтому целые числа идут в int-array, а строки - в массив String. – Entrusc
Также сжатие GZIP будет определять часть трафика (в обмен на производительность, конечно). Особенно, если у вас много одинаковых объектов в непосредственной близости от вашего массива. – Entrusc
- 1. Как отправить строку через сокет в python на java-сервер?
- 2. java: Отправить метод через сокет
- 3. как отправить EOF через сокет в java
- 4. Java отправить скриншот через сокет
- 5. Отправить объект через сокет
- 6. Отправить команды принтера через сокет в Java
- 7. Отправить (параллельный) поток через сокет в Java
- 8. Отправка фиктивных данных через сокет на android на java-сервер
- 9. отправить arraylist через сокет
- 10. отправить большой массив байтов через java-сокет
- 11. Как отправить байты через сокет в python?
- 12. Отправить сериализованный объект через сокет
- 13. Как отправить информацию для входа на сервер через сокет в java
- 14. Как отправить данные XML через сокет InputStream
- 15. Как отправить canvas.Children через сокет?
- 16. Отправить объект через сокет
- 17. Как отправить данные с клиента C# на java-сервер через сокет?
- 18. Как отправить изображение через TCP-сокет в java
- 19. Как отправить переменную wstring через сокет?
- 20. Как пропустить ECPublicKey через сокет в java
- 21. Как отправить изображение через HTTP-сервер java
- 22. Отправить 5 МБ данных через сокет?
- 23. Отправить большие файлы через сокет в C
- 24. Java сокет-сервер
- 25. Java сокет-сервер в облаке сервер
- 26. Как отправить файл через сокет в C#
- 27. Как передать cookie через сокет в Java
- 28. Передача изображений 565RGB через сокет в java
- 29. Как отправить ArrayList через сокет? (TCP)
- 30. как отправить данные на сервер через MultipartEntity
«должен быть оптимальным» оптимальным способом? Скорость? Безопасность? Надежность? Вы что-то пробовали? В его нынешнем виде вопрос слишком широк! – Burkhard
С точки зрения скорости – Shahzaib
В зависимости от скорости и качества сети может быть полезно сжать поток. Опять же, пожалуйста, добавьте некоторые подробности! – Burkhard