【问题标题】:StringBuffer doesn't append data - due to thread?StringBuffer 不附加数据 - 由于线程?
【发布时间】:2010-07-31 18:14:20
【问题描述】:

我的目标是从客户端收集数据,这些客户端将数据发送到 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();
            } 
        }
    }
}

我已经调试过了:变量“sentences”总是得到正确的数据,但是 data.append(sentence);不做任何事情。它只是不附加数据。为什么会这样?

【问题讨论】:

  • 您是否使用调试器在追加之前/之后查看了字符串缓冲区??
  • 还有一个错误。您的字符串缓冲区变量需要在附加新数据之前被清除。可能是 data.setLength(0) 然后开始追加新数据。但这并不能解决你原来的问题
  • 我认为这与您的问题无关,但始终使用 new String(...) 和 String.getBytes(...) 指定一个字符集。我建议始终使用“UTF-8”。另外,您的行 sendData = new byte[1024];没用。 sendData 将是 data.toString() 方法返回的任何内容,可能大于 1024 字节。据推测,这是您代码中的错误。

标签: java multithreading udp


【解决方案1】:

您的问题与StringBuffer无关,而与这一行有关:

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

当发送方发送的数据可能小于缓冲区的大小时,您正在将整个缓冲区转换为字符串。所以你会在结果字符串中得到一堆零字节,这会导致你打印的数据被截断。

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

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

【讨论】:

  • 谢谢。我没有考虑零字节。现在它可以按我的意愿工作了。
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2014-11-29
  • 2014-10-24
  • 1970-01-01
  • 2013-02-08
相关资源
最近更新 更多