2011-09-08 168 views
1

伙计!我写一个简单的程序来发送消息到游戏服务器(反恐精英),该消息被用于查询服务器的信息,它有一个固定的格式:java发送UDP数据包问题

0xff, 0xff, 0xff, 0xff, 0x54, 0x53, 0x6f, 0x75, 
0x72, 0x63, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x69, 
0x6e, 0x65, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 
0x00 

我的Java程序:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 

public class Test { 

    private static DatagramSocket ds; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     try { 
      ds = new DatagramSocket(27022); 
      byte[] data; 
      // TSource Engine Query 
      char peer0_0[] = { 
       0xff, 0xff, 0xff, 0xff, 
       0x54, 0x53, 0x6f, 0x75, 
       0x72, 0x63, 0x65, 0x20, 
       0x45, 0x6e, 0x67, 0x69, 
       0x6e, 0x65, 0x20, 0x51, 
       0x75, 0x65, 0x72, 0x79, 0x00 
      }; 
      data = new String(peer0_0).getBytes(); 

      System.out.println("send: " + new String(data)); 

      DatagramPacket dp = new DatagramPacket(data, 0, data.length, InetAddress.getByName("219.133.59.20"), 27021); 

      ds.send(dp); 
      byte[] rec = new byte[1024]; 
      DatagramPacket dp2 = new DatagramPacket(rec, 1024); 
      ds.receive(dp2); 

      System.out.println("receive: " + new String(rec)); 

      ds.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      if(ds != null) ds.close(); 
     } 
    } 

} 

但是当我运行它,我使用Wireshark捕捉包,我得到这个:

enter image description here 前四个字节0​​x3F的不是0xFF的,所以有什么问题呢?我在Windows 7中文版上运行java 6。

回答

4

通过Stringchar[]byte[]的转换不保证是无损的,因为它涉及字符集转换。

尝试声明peer0_0[]作为byte数组并直接使用它。

+0

谢谢aix!但是我怎样才能在字节中表示0xff,0xff = 255,但是java中的最大字节是127 – CaiNiaoCoder

+0

@YAMaiDie:'(byte)0xff' – NPE

+0

+1:字符和字节在Java中是两个非常不同的东西。 –