Как избавиться от пустого остатка буфера? - PullRequest
3 голосов
/ 22 ноября 2011

У меня есть сервер-клиентское приложение, которое использует дейтаграмму для обмена сообщениями.Я изначально установил размер буфера в 1024 байта, потому что я не знаю длину сообщений.Когда я отправляю что-то, что короче, чем 1024 байта, остальная часть моей строки отображается как некоторые странные символы (нулевые символы или я не уверен, как они называются).Вот экран: string buffer null characters

Код клиента: byte[] buf = ("This is another packet.\n").getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet)

Код сервера: byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet);

Ответы [ 4 ]

9 голосов
/ 11 октября 2013
socket.receive(packet);
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());
4 голосов
/ 23 ноября 2011

DatagramPacket.getLength() возвращает фактическую длину принятого пакета.Если вы не создали пакет с ненулевым смещением, это означает, что данные находятся в {0..getLength()-1}.

. Обратите внимание, что это означает, что исходная длина, с которой вы создали DatagramPacket, потеряна, что, в свою очередь, означает, чтоВы должны либо использовать новый DatagramPacket для каждого получения, либо хотя бы повторно инициализировать его буфер данных с помощью setData().В противном случае DatagramPacket будет уменьшаться до размера самого маленького полученного пакета.

1 голос
/ 26 ноября 2011

Хорошо, поэтому я нашел решение, которое работало для меня:

    public String getRidOfAnnoyingChar(DatagramPacket packet){
        String result = new String(packet.getData());
        char[] annoyingchar = new char[1];
        char[] charresult = result.toCharArray();
        result = "";
        for(int i=0;i<charresult.length;i++){
            if(charresult[i]==annoyingchar[0]){
                break;
            }
            result+=charresult[i];
        }
        return result;
    }

РЕДАКТИРОВАТЬ: Существует лучшее решение с использованием ByteArrayOutputStream, которое можно найти здесь: Как переинициализировать буфер пакета?

1 голос
/ 22 ноября 2011

Вы должны проверить packet.getOffset(), чтобы найти, где в буфере начинаются полученные данные, и packet.getLength(), чтобы получить длину данных (в байтах).

Вам также следует учитывать, что если полученный пакет слишком велик для размещения в предоставленном буфере (в вашем случае> 1024 байта), дополнительные данные просто отбрасываются. Если вам не нужно быть очень осторожным в использовании памяти, вы должны использовать больший буфер, чтобы убедиться, что весь пакет поместится. В случае UDP максимальный размер пакета составляет 64 КБ.

...