StringBuffer не добавляет данные - из-за потока?

Моя цель - собрать данные от клиентов, которые отправляют данные на сервер UDP, объединить данные в строку (сейчас только для тестирования) и отправить всю объединенную строку обратно клиенту. Связь между UDPClient и UDPServer работает идеально. Я могу отправлять данные и получать их. Но мне интересно, почему я не могу объединить данные в StringBuffer, потому что, когда я пытаюсь это сделать, клиент всегда получает самую первую строку, которую я когда-либо отправлял. И строка больше не меняется, независимо от того, что я отправляю на сервер. Вот код класса сервера:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer extends Thread {

     DatagramSocket serverSocket;
     DatagramPacket receivePacket;
     String sentence;
     InetAddress IPAddress;
     StringBuffer data = new StringBuffer();

    public UDPServer() throws SocketException {
        serverSocket = new DatagramSocket(9876);
    }

    public void run()    {
        while (true)  {
             byte[] receiveData = new byte[1024];
             byte[] sendData = new byte[1024];
             receivePacket = new DatagramPacket(receiveData, receiveData.length);

             try {
                 serverSocket.receive(receivePacket);
            } catch (IOException e) {
                 System.out.println("receive....");
                e.printStackTrace();
            }

             sentence = new String(receivePacket.getData());
             IPAddress = receivePacket.getAddress();
             int port = receivePacket.getPort();
             data.append(sentence);
             sendData = data.toString().trim().getBytes();
             DatagramPacket sendPacket = new DatagramPacket(sendData,
             sendData.length, IPAddress, port);
             try {
                serverSocket.send(sendPacket);
            } catch (IOException e) {
                System.out.println("send...");
                e.printStackTrace();
            } 
        }
    }
}

Я уже отлаживал это: переменная "предложения" всегда получает правильные данные, но строка data.append (предложение); ничего не делает. Он просто не добавляет данные. Почему это так?


person Bevor    schedule 31.07.2010    source источник
comment
смотрели ли вы в строковом буфере до / после добавления с помощью отладчика ??   -  person hvgotcodes    schedule 31.07.2010
comment
Есть еще одна ошибка. Перед добавлением новых данных необходимо очистить переменную строкового буфера. возможно, data.setLength (0), а затем начать добавлять новые данные. Но это не решит вашу изначальную проблему.   -  person chedine    schedule 31.07.2010
comment
Я не думаю, что это имеет отношение к вашей проблеме, но всегда указывайте кодировку с новыми String (...) и String.getBytes (...). Я рекомендую всегда использовать UTF-8. Также ваша строка sendData = new byte [1024]; бесполезно. sendData будет тем, что возвращает метод data.toString (), который может быть больше 1024 байтов. Предположительно, это ошибка в вашем коде.   -  person President James K. Polk    schedule 31.07.2010


Ответы (1)


Ваша проблема не связана с StringBuffer, а связана с этой строкой:

sentence = new String(receivePacket.getData());

Вы превращаете весь буфер в строку, когда отправитель мог отправить меньше, чем размер буфера. Таким образом, вы получаете кучу нулевых байтов в результирующей строке, что приводит к усечению печатаемых вами данных.

Вам нужно усечь буфер приема в зависимости от того, сколько данных было фактически прочитано:

sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
person vanza    schedule 31.07.2010
comment
Спасибо. Я не думал о нулевых байтах. Теперь работает как я хочу. - person Bevor; 31.07.2010