【发布时间】:2016-04-20 12:04:10
【问题描述】:
我正在尝试向指定的 dns 服务器发送 udp 数据包并从 dns 服务器接收响应。
问题是我没有得到服务器的响应。我试图用我的客户端套接字接收一个数据包,但没有任何成功。
寻求帮助以解决此问题。
这是我的 UdpClient.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
class UdpClient
{
public static void main (String args[]) throws Exception
{
Scanner scan = new Scanner(System.in);
System.out.print("Enter a hostname: ");
// host name
String hostname = scan.next();
// socket
DatagramSocket clientSocket = new DatagramSocket();
InetAddress ipAddress = InetAddress.getByName(hostname);
String message = "0471001000000";
byte[] data = message.getBytes(StandardCharsets.UTF_8);
// datagram packet
DatagramPacket sendPacket = new DatagramPacket(data, data.length, ipAddress, 53);
// send the packet
clientSocket.send(sendPacket);
// set a receive timeout, 2000 milliseconds
// packet for receive
byte[] rdata = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(rdata, rdata.length, ipAddress, 53);
// wait for a response from the server
clientSocket.receive(receivePacket);
System.out.println("Host Name: " + ipAddress.getHostName());
System.out.println("Canonical Host Name: " + ipAddress.getCanonicalHostName());
System.out.println("Local Host: " + ipAddress.getLocalHost());
System.out.println("Loopback Address: " + ipAddress.getLoopbackAddress());
System.out.println("IPv4: " + ipAddress.getHostAddress());
String serverMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("FROM SERVER: " + serverMessage);
}
}
【问题讨论】:
-
您是否验证服务器正在接收数据包?
-
我如何验证这一点?例如,当我输入“google.com”时,程序正在等待 clientSocket.receive(reicePacket) 行并且什么都不做。
-
我的错误。我以为它是本地服务器。
-
远程名称服务器希望您向其发送 DNS 有线格式。 Java 不是我的语言,但看起来你没有这样做。所以我的猜测是你的 UDP 数据包可以很好地到达服务器,但是服务器认为它的不可解析垃圾并忽略它。
-
@PauliusAleksiūnas 我认为我下面的答案应该是公认的答案。