2014-10-11 109 views
0

我使用下面的Java代码,试图发送一个PACKET_UDP_CLIENT_FIND_SERVERsource)数据包来查询OpenTTD服务器:查询的OpenTTD服务器

InetAddress address = InetAddress.getByName("publicserver-new.openttdcoop.org"); 
DatagramSocket socket = new DatagramSocket(); 
byte[] buf = new byte[]{0}; // 0 is number for CLIENT_FIND_SERVER, no extra data is needed (?) 
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 3983); 
socket.send(packet); 

packet = new DatagramPacket(buf, buf.length); 
socket.receive(packet); 
packet.getData(); // 
socket.close(); 

然而,当我运行该程序的服务器永远不会返回任何数据包。我几乎没有使用数据包的经验,并一直试图找出PHP and Python source code做同样的事情要做什么。希望有人能够提供帮助。
感谢

编辑: 我意识到,包实际上应该包含数据03 00 00,前两个字节包含的长度,但我还是一直没能得到使用分组发送的响应。也许我正在听错端口?

+0

在旁注中,因为我对OpenTTD感兴趣,您的意思是Op运输大亨豪华游戏? – 2014-10-11 03:57:20

+0

@ArunRamakrishnan是:http://www.openttd.org,由于版权原因,官方名称是OpenTTD – 2014-10-11 04:00:27

+0

哦,太棒了!我原来是在aaaaaaaages之前。我听说过OpenTTD,但从未尝试过。感谢您的链接,我想我现在会尝试。对不起,侧重于你的问题虽然:) – 2014-10-11 05:39:40

回答

1

我想清楚我做错了什么。这条线:
byte[] buf = new byte[]{0};

应该是:
byte[] buf = new byte[]{0x03, 0x00, 0x00}(十六进制为清楚起见)

的问题是,前两个字节存储数据的长度
第三个字节是实际的请求

此外,DatagamPacket需要重置,以允许读取多于3个字节

+1

就是这样,这似乎工作。再次感谢您向我介绍OpenTTD,刚开始播放。原来的美好回忆。 – 2014-10-14 08:19:02