2010-07-31 67 views
0

我的目標是收集客戶端的數據,這些客戶端將數據發送到UDP服務器,將字符串中的數據連接起來(僅用於測試),並將整個連接字符串發送回客戶端。 UDPClient和UDPServer之間的通信非常完美。我可以發送數據並接收它。但是我想知道爲什麼我不能在一個StringBuffer中連接數據,因爲當我嘗試時,客戶端總是獲得我發送的第一個字符串。不管我發送給服務器的是什麼字符串都不會改變。 這裏是服務器類的代碼: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(句);沒有做任何事情。它只是不附加數據。這是爲什麼?

+0

你在字符串緩衝區看着前/後追加,與調試器? – hvgotcodes 2010-07-31 18:35:58

+0

還有一個bug。在追加新數據之前,你的stringbuffer變量需要被清除。可能是data.setLength(0),然後開始附加新數據。但是這不會解決你原來的問題 – chedine 2010-07-31 18:46:40

+0

我不認爲它與你的問題有關,但總是用新的String(...)和String.getBytes(...)指定一個字符集。我建議您始終使用「UTF-8」。另外,你的行sendData = new byte [1024];沒用。 sendData將是data.toString()方法返回的任何值,可能大於1024字節。據推測,這是你的代碼中的一個錯誤。 – 2010-07-31 18:49:03

回答

4

您的問題無關StringBuffer的,但這一行:

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

你轉動整個緩衝區成一個字符串,當發送者可能比緩衝區的大小已將少。所以你會在結果字符串中得到一堆零字節,這會導致你打印的數據被截斷。

您需要根據有多少數據實際被讀截斷接收緩衝區:

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

謝謝。我沒有考慮零字節。現在它按我的意願工作。 – Bevor 2010-07-31 19:42:41