代码之家  ›  专栏  ›  技术社区  ›  Bevor

StringBuffer不追加数据-由于线程?

  •  0
  • Bevor  · 技术社区  · 15 年前

    以下是服务器类的代码:

    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();
                } 
            }
        }
    }
    

    我已经调试过了:变量“句”总是得到正确的数据,但行数据是正确的;什么都不做。它只是没有附加数据。为什么会这样?

    1 回复  |  直到 15 年前
        1
  •  5
  •   vanza    15 年前

    您的问题与StringBuffer无关,但与以下行有关:

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

    您正在将整个缓冲区变成一个字符串,而发送方发送的数据可能小于缓冲区的大小。因此,结果字符串中有一堆零字节,这会导致打印的数据被截断。

    您需要根据实际读取的数据量截断接收缓冲区:

    sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());