3.Java网络编程之IP
前面两篇博文我们已经简单了解了IP、端口、协议以及两种参考模型,我们现在重新从程序角度来看下这个参考模型.
如果我们从事的是Web网站开发,那么我们应该知道HTML是一种超文本标记语言 (Hyper Text Markup Language),而asp、php、jsp则是动态地生成HTML页面的技术,而HTTP是超文本传输协义,是基于WWW,HTML是超文本传输语言,是基于HTTP.因此我们开发时其实是在应用层进行开发。
如果我们从事的是网络编程则是在传输层和网际层进行开发。
IP协议:
理解:
我们如果想和网上某一台计算机进行通讯,首先我们需要要考虑如何和对方建立连接的问题,我们打算使用有线的光纤进行连接?还是通过有线电话或者手机进行通 讯?这就是数据链路层和物理层要干的事。建立连接后,你打算和谁进行通讯?如果是手机,你是不是需要拨通一个手机号码?但是如果是电脑的话,你想和谁聊天 如何确定?这时就需要通过网际层的IP协议来区分哪个IP是谁,这样你才可以准确和你想聊天的人进行聊天。
上面说了这么多概念废话,现在我们来实战用Java写一个小程序来获取本地计算机的主机名和IP。
我们要用到的知识点如下:
IPDemo.java源码如下:
import java.net.*; class IPDemo { public static void main(String[] args)throws Exception { InetAddress i=InetAddress.getLocalHost(); System.out.println(i.toString());//打印本地主机名和本地IP地址 System.out.println("address:"+i.getHostAddress());//打印本地IP地址 System.out.println("name:"+i.getHostName());//打印本地主机名 } }
程序截图:
上面这个是获取的本地计算机的主机名和IP地址,那么能不能输入任意一个计算机的主机名就获取该计算机的相关信息呢?
在java.net包下提供了这么一个方法。
使用这个方法可以实现,但是要注意的是这个实现并不是所有都可以,那么为什么呢?
这里要补充一个知识点,我们知道在网络中是通过IP地址来区分谁是谁,哪个计算机是哪台计算机的。但是这个IP地址并不好记,因此后来引入了域名.当我们在浏览器地址栏输入:
http://www.baidu.com
这时候我们的计算机会首先访问本地计算机的C:\WINDOWS\system32\drivers\etc\host文件进行查询,
# Copyright (c) 1993-1999 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host
#127.0.0.1 localhost #203.208.46.146 www.google.com #203.208.46.146 dl.google.com #203.208.46.146 dl-ssl.google.com
查询后没有发现www.baidu.com,则向附近的DNS域名服务器发出请求,进行相同的查询。
虽然我没有看过DNS域名服务器数据存放格式但是推测至少应该有这样一个类似的文档。
......
#61.135.169.121
www.baidu.com
#61.135.169.125
www.baidu.com
#111.13.100.91 www.baidu.com
#221.176.187.238
www.sina.com.cn
......
当我们查询到www.baidu.com对应的ip后,DNS域名解析后,浏览器中的内容就变成了:
http://61.135.169.121
这时计算机开始向该IP对应的服务器发出请求,服务器接受请求后反馈给我们一个页面,我们就看到了百度的首页了。
因此,只有host文件或者DNS域名服务器中有对应的信息才可以查到。
了解完这个后,我们再来写这个程序。
我们现在要做的是输入一个域名,获取该域名所对应的IP。
IPDemo.java源码如下:
import java.net.*; class IPDemo { public static void main(String[] args)throws Exception { InetAddress i=InetAddress.getByName("www.baidu.com"); System.out.println("address:"+i.getHostAddress());//打印该主机IP地址 System.out.println("name:"+i.getHostName());//打印该主机主机名 } }
这里要注意的是由于百度要向很多用户提供服务,因此对应的IP不止一个。
程序运行截图:
附录:
使用站长工具查询结果:
使用IP.CN网站查询结果:
使用ping方式查询结果: