背景: 要想传输东西,首先要定位,你都不知道该传给谁,怎么进行传输,所以需要以下两步
网络编程中有两个主要的问题:
1)如何准确地定位网络上一台或多台主机:
通信双方地址
a) IP 地址:InetAddress(java的一个类)唯一的标识 Internet 上的计算机 ,一个InetAdress的对象就代表着一个IP地址, 本地回环地址(hostAddress):
127.0.0.1 主机名(hostName):localhost 不易记忆
b) 端口号标识正在计算机上运行的进程(程序) 不同的进程有不同的端口号 被规定为一个 16 位的整数 0~65535。其中,0~1023被 预先定义的服务通信占用(如MySql占用端口3306,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突。 端口号与IP地址的组合得出一个网络套接字。
2)找到主机后如何可靠高效地进行数据传输:
a)一定的规则(有两套参考模型) OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
b)TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
模拟图如下:
下图就好像一个人:a给另一个人:b 邮东西,a需要将东西一遍一遍的打包,防止易碎、安全等,
b收到东西,首先需要将所有的包装拆掉才能取到东西。但是传输东西之前,需要明确a b的位置
注:下图的每一层都有各自的协议
获取IP地址
import java.net.InetAddress; import java.net.UnknownHostException; /* * 网络通信的第一个要素:IP地址。通过IP地址,唯一的定位互联网上一台主机 * InetAddress:位于java.net包下 * 1.InetAddress用来代表IP地址。一个InetAdress的对象就代表着一个IP地址 * 2.如何创建InetAddress的对象:getByName(String host) * 3.getHostName(): 获取IP地址对应的域名 * getHostAddress():获取IP地址 */ public class TestInetAddress { public static void main(String[] args) throws Exception { //创建一个InetAddress对象:getByName() InetAddress inet = InetAddress.getByName("www.atguigu.com"); //inet = InetAddress.getByName("42.121.6.2"); System.out.println(inet); //两个方法 System.out.println(inet.getHostName()); System.out.println(inet.getHostAddress()); //获取本机的IP:getLocalHost() InetAddress inet1 = InetAddress.getLocalHost(); System.out.println(inet1); System.out.println(inet1.getHostName()); System.out.println(inet1.getHostAddress()); } }