黑马程序员技术交流社区

标题: 为什么返回的不是DNS对应的ip地址 [打印本页]

作者: 黑马李超    时间: 2013-3-10 13:26
标题: 为什么返回的不是DNS对应的ip地址
做了一个简单的浏览器,按照老毕讲的,输入域名后会先访问DNS服务器,然后返回ip地址。
再用ip地址访问指定网页。但是输入www.baidu.com,直接就拿到代码了。(本地hosts没有
ip地址和域名映射关系).求指教。
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;

  5. /*
  6. 建立一个frame窗口,有基本的输入框和转到按钮
  7. 以及显示文本域,要求能在输入框中输入指定url,
  8. 在文本域显示返回指定url页面源代码。
  9. */
  10. class MyWindow //建立窗口
  11. {
  12.         private Frame f;
  13.         private TextField tf;
  14.         private Button but;
  15.         private TextArea ta;
  16.         private Dialog d;
  17.         private Label lab;
  18.         private Button okBut;

  19.         MyWindow()
  20.         {
  21.                 init();// 初始化运行窗口函数
  22.         }

  23.         private void init() //窗口函数
  24.         {
  25.                 f = new Frame("ie");
  26.                 f.setBounds(500,300,700,600);
  27.                 f.setLayout(new FlowLayout());

  28.                 tf = new TextField(50);
  29.                 but = new Button("转到");
  30.                 ta = new TextArea(30,70);

  31.                 d = new Dialog(f,"提示信息",true);
  32.                 d.setBounds(550,350,200,120);
  33.                 d.setLayout(new FlowLayout());
  34.                 lab = new Label();
  35.                 okBut = new Button("确定");
  36.                 d.add(lab);
  37.                 d.add(okBut);


  38.                 f.add(tf);
  39.                 f.add(but);
  40.                 f.add(ta);

  41.                 myEvent();

  42.                 f.setVisible(true);
  43.         }
  44.         private void myEvent() //定义需求的监听事件
  45.         {
  46.                 f.addWindowListener(new WindowAdapter()//frame窗口关闭
  47.                 {
  48.                         public void windowClosing(WindowEvent e)
  49.                         {
  50.                                 System.exit(0);
  51.                         }
  52.                 });
  53.                 tf.addKeyListener(new KeyAdapter()//文本框键入ENTER 跳转
  54.                 {
  55.                         public void keyPressed(KeyEvent e)
  56.                         {
  57.                                 if(e.getKeyCode()==KeyEvent.VK_ENTER)
  58.                                         connect();
  59.                         }
  60.                 });
  61.                 but.addActionListener(new ActionListener()//转到按钮跳转
  62.                 {
  63.                         public void actionPerformed(ActionEvent e)
  64.                         {
  65.                                 connect();
  66.                         }
  67.                 });
  68.                 d.addWindowListener(new WindowAdapter()//对话框窗口关闭
  69.                 {
  70.                         public void windowClosing(WindowEvent e)
  71.                         {
  72.                                 d.setVisible(false);
  73.                         }
  74.                 });
  75.                 okBut.addActionListener(new ActionListener()//对话框确定按钮关闭对话框
  76.                 {
  77.                         public void actionPerformed(ActionEvent e)
  78.                         {
  79.                                 d.setVisible(false);
  80.                         }
  81.                 });

  82.         }
  83.         private void connect() //点击转到按钮或文本框回车后连接指定URL
  84.         {
  85.                 try
  86.                 {
  87.                         String urlstr = tf.getText();
  88.                         if(!(urlstr.startsWith("www") || urlstr.startsWith("http://")))
  89.                         {
  90.                                 lab.setText("您输入的地址"+urlstr+"错误,请重新输入");
  91.                                 d.setVisible(true);
  92.                         }
  93.                         else
  94.                         {
  95.                                 URL url = null;
  96.                                 if(urlstr.startsWith("www"))
  97.                                         url = new URL("http://"+urlstr);
  98.                                 else
  99.                                         url = new URL(urlstr);
  100.                                 System.out.println(InetAddress.getByName(url.getHost())+":"+url.getPort()+"..."+url.getFile());
  101.                                 URLConnection ucon = url.openConnection();//只连接了一次

  102.                                 InputStream in = ucon.getInputStream();//得到服务器返回内容

  103.                                 ta.setText("");

  104.                                 byte[] buf = new byte[1024];
  105.                                 int len = 0;
  106.                                 while ((len=in.read(buf))!=-1)
  107.                                 {
  108.                                         ta.append(new String(buf,0,len)+"\r\n");
  109.                                 }
  110.                         }
  111.                 }
  112.                 catch (Exception e)
  113.                 {
  114.                         throw new RuntimeException("跳转失败");
  115.                 }
  116.                
  117.         }
  118. }
  119. class IEDemo
  120. {

  121.         public static void main(String[] args)
  122.         {
  123.                 new MyWindow();
  124.         }
  125. }
复制代码


作者: 谢洋    时间: 2013-3-10 16:37
你怎么确定你是直接拿到?
作者: 黑马李超    时间: 2013-3-10 17:07
谢洋 发表于 2013-3-10 16:37
你怎么确定你是直接拿到?

如果输入的是www.baidu.com
URL url = new URL("http://www.baidu.com");
按照老毕的说法 ,需要到DNS服务器中查找www.baidu.com对应的ip值,再返回来。
然后再用这个ip值去访问百度。
怎么样来证明浏览器向DNS服务器进行查询对应ip地址了?
作者: 谢洋    时间: 2013-3-10 17:49
黑马李超 发表于 2013-3-10 17:07
如果输入的是www.baidu.com
URL url = new URL("http://www.baidu.com");
按照老毕的说法 ,需要到DNS服 ...

浏览器是应用层,他会把URL("http://www.baidu.com");
转交给下层的网络协议程序处理,具体我也不懂
原理跟下面差不多吧
public class IpDemo {
public static void main(String[] args) throws Exception {
  
  InetAddress i = InetAddress.getByName("www.baidu.com");//相当于浏览器进行这样的处理,InetAddress如果不主机上找不到,就到DNS那里找了
  System.out.println(i);//www.baidu.com/115.239.210.26
}
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2