2016-08-24 3 views
-1

У меня есть 2D динамический массив, содержащий целые числа и строки, которые мне нужно отправить на сервер. Массив состоит из 100 000 столбцов. Одна из возможностей - скопировать массив в файл и отправить его на сервер, и сервер может его проанализировать. В то время как другая возможность заключается в сериализации. Я делаю сокет-программирование в первый раз, и решение, которое я ищу, должно быть оптимальным. Учитывая размер массива, я не думаю, что преобразование каждого элемента в байты было бы хорошим. Пожалуйста, не могли бы вы дать мне небольшой намек или направить меня на то, как я должен действовать.Как отправить 2D-массив через сокет на сервер в Java

+2

«должен быть оптимальным» оптимальным способом? Скорость? Безопасность? Надежность? Вы что-то пробовали? В его нынешнем виде вопрос слишком широк! – Burkhard

+0

С точки зрения скорости – Shahzaib

+0

В зависимости от скорости и качества сети может быть полезно сжать поток. Опять же, пожалуйста, добавьте некоторые подробности! – Burkhard

ответ

0

Сериализация данных в байтах для потоковой передачи по сокету или сериализация данных в файл, а отправка файла по существу такая же. Если вы сериализовываете файл, вы можете отказаться от установленного протокола, такого как FTP, который будет проще для разработчиков, новых для сокетов.

Опять же, поймите, что это по сути та же проблема. Прерывание программного объекта в байтах для записи в выходной поток.

Edit:

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

  • Число подходов, которым нужно следовать. (Поскольку вы не указали max ROWS в вашем 2D-массиве, я не могу сказать, сколько байтов это займет. Мы будем считать его 8 байтов.)
  • Все объекты. Это займет 3 * NUM_INTS байта.
  • Zip сжатые строки, разделенные пробелом.

Я делаю много предположений здесь, потому что вы не были достаточно конкретны в своем вопросе или каких-либо ответах, которые вы дали.

+0

Теперь проблема в том, о каком типе файла мы говорим? – Shahzaib

+0

Это зависит от того, какой тип данных у вас есть. Каков диапазон ваших целых чисел? Должен ли этот файл потреблять люди? Как долго ваши строки? @Shahzaib –

+0

Целые числа состоят из шести цифр, а строки имеют 10 символов. – Shahzaib

0

Я бы конвертировал его в json или xml и отправил это. Это не самые эффективные решения с точки зрения скорости, но самые портативные.

+1

CSV тоже хорош. –

+0

Это, кажется, хорошее предложение ... Позвольте мне подумать об этом – Shahzaib

0

Простым подходом было бы использовать 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())). Разумеется, вам нужно распаковать его на стороне сервера, чтобы это работало.

+0

Итак, в основном мы будем анализировать каждый элемент массива и записывать его на сервер. Не будет ли это слишком много сетевого трафика? Другими словами, скорость будет уменьшаться. – Shahzaib

+0

Это в основном то, что делает протокол сериализации. За исключением разбора какого-либо объекта и потери байта для каждого элемента, чтобы позже рассказать им обособленно, это оптимально. Если вам нужна более высокая скорость и меньше данных, я предлагаю разделить объекты и поместить их в разные массивы - поэтому целые числа идут в int-array, а строки - в массив String. – Entrusc

+0

Также сжатие GZIP будет определять часть трафика (в обмен на производительность, конечно). Особенно, если у вас много одинаковых объектов в непосредственной близости от вашего массива. – Entrusc

Смежные вопросы