2011-10-02 59 views
0

我正在使用UDP傳輸實現客戶端/服務器應用程序。這裏是我的我的代碼部分:DatagramPacket不傳送正確的消息

客戶:

InetAddress serverAddress = ... 
int serverPort = ... 
DatagramSocket socket = new DatagramSocket(9999); 

... 

String message = "<HELLO>"; 

byte[] outbuffer = new byte[1000]; 
outbuffer = message.getBytes(); 
DatagramPacket packet = new DatagramPacket(outbuffer, outbuffer.length, serverAddress, serverPort); 
socket.send(this.packet); 

服務器:

DatagramSocket serverSocket = new DatagramSocket(9876); 

... 

byte[] inbuffer = new byte[1000]; 
DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length); 
serverSocket.receive(packet); 
String response = new String(packet.getData(), 0, packet.getLength()); 

System.out.println(response); 

if("<HELLO>".equals(response)){ 
    System.out.println("OK"); 
} else { 
    System.out.println("ERROR"); 
} 

我的問題是:如果我打印的是從正在添加客戶端的響應字符串客戶端,一切都很好(「」)。 但由於某些原因,當我使用.equals或RegExp比較來自服務器的響應時,它會失敗!

可能與字符串編碼有關,但我不知道它在哪裏以及爲什麼會失敗。客戶端和服務器現在都在同一主機上運行,​​因此它可能與JVM差異無關。

回答

2

您目前正在使用平臺默認編碼來編碼和解碼字符串。你應該絕對不會那樣做。在getBytes()調用和構造函數調用中指定編碼,例如

byte[] outBuffer = message.getBytes("UTF-8"); 

另外請注意,當前的代碼創建長度爲1000字節數組,然後立即拋出它扔掉:

byte[] outbuffer = new byte[1000]; 
// Byte array created on previous line is now useless! 
outbuffer = message.getBytes(); 

...不這樣做。

我們無法從您給我們的代碼中真正告訴更多 - 如果您可以製作簡短但完整的程序來證明問題,那將非常有幫助。

對於調試,我建議你記錄你收到的數據報包的內容,同時仍然是二進制。推測這不是你想要的,但這並不能幫助顯示它是什麼

編輯:這裏有一對短而完整的方案,其中對工作:

import java.net.*; 

public class Server { 
    public static void main(String[] args) throws Exception{ 
     DatagramSocket socket = new DatagramSocket(9999); 
     byte[] inbuffer = new byte[1000]; 
     DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length); 
     socket.receive(packet); 
     String response = new String(packet.getData(), 0, 
            packet.getLength(), "UTF-8"); 

     System.out.println(response); 

     if("<HELLO>".equals(response)){ 
      System.out.println("OK"); 
     } else { 
      System.out.println("ERROR"); 
     } 
    } 
} 

// Client.java 
import java.net.*; 

public class Client { 
    public static void main(String[] args) throws Exception { 
     DatagramSocket socket = new DatagramSocket(); 
     byte[] output = "<HELLO>".getBytes("UTF-8"); 
     DatagramPacket packet = new DatagramPacket(output, output.length, 
                InetAddress.getLocalHost(), 
                9999); 
     socket.send(packet); 
    } 
} 
+0

當然,這是相關的編碼!非常感謝 ! – Kami

0

您有一個變量responsereponse

我假設他們不會一樣,你的測試應該失敗。

這是你應該能夠在調試器中看到的東西。