java - StringBuffer 不附加数据 - 由于线程?

标签 java multithreading udp

我的目标是从将数据发送到 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);什么都不做。它只是不附加数据。为什么会这样?

最佳答案

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

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

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

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

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

关于java - StringBuffer 不附加数据 - 由于线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379281/

相关文章:

java - 如何对两个对象使用集合方法(removeAll() 和 retainAll())。 (对象是父子关系)

java - OrmLite:在 WHERE NOT 周围和/或条件下构建

c# - 如何识别在 PerfMon 中占用 100% CPU 使用率的应用程序线程?

java - 数据库在后台持续存在

java - 使 Dialog 在 AsyncTask 完成后关闭

c - socket()中 "protocol"为SOCK_DGRAM或SOCK_STREAM时是否需要指定 "type"?

java - 不使用 Swing 将图像添加到 GUI? java

java - 使用 SimpleDateFormat 将日期转换为友好格式

c# - 网络地址识别

java.io.StreamCorruptedException : invalid stream header: 4C756E69