DatagramPacket в строку - PullRequest
       7

DatagramPacket в строку

5 голосов
/ 19 декабря 2011

Попытка преобразовать полученный DatagramPacket в строку, но у меня небольшая проблема.Не уверен, что это лучший способ сделать это.

Данные, которые я получу, в основном имеют неизвестную длину, поэтому у меня на приемной стороне установлен некоторый буфер [1024].Проблема в том, что я отправил строку "abc" и выполнил следующие действия на стороне моего получателя ...

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
buffer = packet.getData();
System.out.println("Received: "+new String(buffer));

Я получил следующий вывод: abc [] [] [] []] [][] [] ..... вплоть до длины буфера.Я предполагаю, что весь мусор / ноль в конце должен был быть проигнорирован, поэтому я должен делать что-то не так.выходит очень хорошо.

Спасибо.

Ответы [ 6 ]

8 голосов
/ 19 декабря 2011
new String(buffer, 0, packet.getLength())
2 голосов
/ 07 января 2017

Вместо этого используйте этот код: String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());

2 голосов
/ 19 декабря 2011

Поле длины DatagramPacket дает длину фактического полученного пакета.Обратитесь к javadoc для DatagramPacket.receive для получения более подробной информации.

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

См., Например, ответы @jtahlborn или @ GiangPhanThanhGiang.


Тем не менее остается проблема того, какую кодировку символов следует использовать при декодировании байтов в строку UTF-16.Для вашего конкретного примера это, вероятно, не имеет значения.Но если вы передаете данные, которые могут содержать не-ASCII-символы, то вам нужно декодировать, используя правильную кодировку.Если вы ошиблись, вы можете получить искаженные символы в ваших String значениях.

0 голосов
/ 17 декабря 2017

Попробуйте

System.out.println("Received: "+new String(buffer).trim());

или

String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);
0 голосов
/ 02 ноября 2016

Используйте этот код вместо

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String data = new String(packet.getData());
System.out.println("Received: "+data);
0 голосов
/ 19 декабря 2011

Насколько я понимаю, в конце DatagramPacket просто куча мусора. Как предполагает Стивен С., вы можете найти фактическую полученную длину. В этом случае используйте:

int realSize = packet.getLength() //Method suggested by Stephen C.
byte[] realPacket = new byte[realSize];
System.arrayCopy(buffer, 0, realPacket, 0, realSize);

Что касается определения длины, я не знаю.

...