网络编程1
11.1.什么是网络?
在计算机领域中网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享。
作用:信息传输,资源共享
优点: 资源共享免费
11.2.OSI七层参考模型和TCP/IP四层参考模型
计算机网络是指由通信线路互相连接的许多自主工作的计算机构成的集合体,各个部件之间以何种规则进行通信,就是网络模型研究的问题。
网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型。这两个模型在网络中应用最为广泛。
OSI七层参考模型
应用层\表示层\会话层\传输层\网络层\数据链路层\物理层
应用层、传输层、IP层【网际层】、网路接口层【网络连入层】
11.3.计算机网络四要素
1.IP地址
IP是Internet Protocol(网际互连协议)
地址--表示网络中计算机的位置。
处于网络中的通信设备(电脑、手机、电视等),都会分配一个ip地址。这些设备在通信之前,首先要通过通信设备的网卡接入到网络中。而这个网卡属于一个硬件,并且所有的网卡在出厂的时候,都有一个固定的网卡地址。并且这个网卡地址(MAC地址)全球唯一。
查看网卡地址(MAC地址)
在命令提示行窗口中输入 ipconfig /all 可以查询ip(mac地址)相关的详细信息
【linux操作系统使用ifconfig可以查询ip(mac地址)相关的详细信息】
所有的网卡都有一个唯一的物理地址,但是这个地址非常的不好记。于是给每个网卡有分了一个逻辑(IP)地址。这个逻辑地址就是ip地址。通信的过程中,就可以根据这个逻辑地址找到处于网络中的这台设备。
IP地址也是对处于网络中的某个通信终端的标识。然后通信的另外一方,就可以根据这个ip地址找到对方,和对方进行通信。
由于IP地址也不容易记忆,因此又给每个ip绑定了一个名称。这个名称被称为(域名)。
https://www.baidu.com/[域名]---DNS服务器【域名解析服务器】----IP地址----网卡物理地址
通信设备只要连接到网络中,网络就会给这个设备分配一个IP地址。要进行网络通信,必须使用的IP地址。通信设备能够联网,就必须要有网卡,每个网卡有一个物理地址(MAC地址,是唯一的)。但是每个网卡在出厂的时候,就已经绑定死了一个IP地址,本地回环地址(127.0.0.1)。
本机默认的ip地址是127.0.0.1;它有一个对应的默认的域名localhost。
- 域名解析
访问网络的时候,真正是需要通过IP地址访问。但是由于IP地址也不容易记忆。因此又给网络中的每个IP地址起名字,这个名称就叫做域名。
当我们在浏览器等可以访问网络的软件中输入了某个域名之后,需要将这个域名解析(解释)成对应的IP地址。这个过程就叫域名解析。
域名解析有2种步:
- 本地解析:
在我们的操作系统中,有一个hosts文件,当输入域名之后,首先会在hosts文件中找有没有当前的域名对应的IP地址,有就会使用这个IP地址。
C:\Windows\System32\drivers\etc\hosts
- DNS服务器解析
如果第一步解析失败了,会到网络中的DNS服务器上进行解析。
DNS服务器中会将全球所有的域名和IP设置在其中。
如果DNS服务器解析失败,说明当前的域名有问题的。
3.协议
协议:通信双方通信的时候需要遵守的通信的规则。
后期我们会遇到很多协议(高级协议,应用协议:http、ftp、https )。
目前我们网络编程介绍的协议属于底层协议,所有的高级协议都是基于底层协议。
有ip可以找到网络中的那个设备,设备之间要通信,还要使用相同的通信协议。
现在我们需要了解2中底层的协议通信协议:
1.TCP:传输控制协议。Transmission Control Protocol 传输控制协议【有连接的协议】
TCP协议在通信的时候,要求通信的双方先建立起连接(面向有连接的协议)。在建立连接的过程中需要经过三次握手才能完成连接的建立。
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
由于TCP协议需要经过三次握手,才能建立连接,因此TCP协议传输数据的时候比较安全,可靠。但是效率较低。
Tcp的优点:传输数据的时候比较安全,可靠。
Tcp的缺点:消耗大,效率较低。
2.UDP:用户数据报协议。UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议。它是面向无连接的协议。发送一方,不用关心接受一方是否在线,能不能接受到数据,接受的数据正确与否。就直接发送数据。如果对方在就可以接受数据,如果对方不在,这时数据就自动的被丢弃。
UDP优点:消耗小,效率较高。
UDP缺点:协议不安全,不可靠,不能传输大数据。
4端口
我们通过ip可以找到网络中具体那个通信终端的设备。而具体需要访问这个设备中的哪个资源(软件)信息,这时由于设备中运行的资源(软件)肯定很多,这时每个资源(软件)必须再给一个唯一的编号(标识)。通过这个标识才能保证我们可以没有错误的访问到指定ip地址的具体那个资源(软件)上。
端口:是一台设备(电脑、手机登)上某个应用程序的唯一标识。设备中运行的任何一个软件,只要启动,就肯定会有一个唯一的编号与其整个软件绑定。
端口从0开始到65535之间。0到1024之间的端口数字已经分配给本机的操作系统的应用程序占用,因此后期我们书写程序如果需要绑定端口,这时必须大于1024.
端口其实就是进入本台计算时,访问本台计算机所运行程序的入口。
例如:九门九车
古代北京内城的九座城门,分别是东直门、朝阳门、西直门、阜成门、德胜门、安定门、崇文门、正阳门、宣武门。
朝阳门门专门是用来走粮车用的。
崇文门又叫哈德门,是专门走酒车的。
正阳门是专门给皇帝走的门。
宣武门走的是囚车。
阜城门专门走的是煤车
西直门走的是水车
德胜门专门是士兵出征走的门。
东直门一般走的就是砖车和木材车。
安定门归来的时候走的门。
11.4.InetAddress类的使用?
在网络中需要连接到另外一个的设备,然后才能进行通信。而处于网络中的任何一个设备都需要唯一的数字地址标识(IP)。
IP是网络中设备中存在的一类特殊的数据,那么Java针对IP整个特殊的数据,也给出了一个类,这个类保存在java.net包下。
java.net 类 InetAddress 此类表示互联网协议 (IP) 地址。
这个封装IP地址的InetAddress类,在创建对象的时候,是需要静态方法来创建对象。
InetAddress类定义:
public class InetAddress implements java.io.Serializable
InetAddress类的构方法
缺省修饰符 InetAddress() {
}
通过这个构造方法我们认识到InetAddress类的构造方法是一个缺省修饰符修饰的
说明跨出InetAddress类所在的Java.net包就不能使用啦。
所以我们在自己的Java程序中是不能通过new+构造方法的方式创建出InetAddress类对象。
我们就需要使用下面这两个静态方法来得到InetAddress类对象
static InetAddress |
getLocalHost() 返回包含有本机IP地址的InetAddress对象。 |
static InetAddress |
getByName(String host) 根据域名得到包含有该域名对应ip地址的InetAddress对象。 |
实例方法:
String |
getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 |
|
String |
getHostName() 获取此 IP 地址的主机名。 |
package com.wangxing.test1;
import java.net.InetAddress;
public class TestInetAddress {
public static void main(String[] args)throws Exception {
//获取本机的ip地址
InetAddress benjiInetAddress=InetAddress.getLocalHost();
String benjiip=benjiInetAddress.getHostAddress();
String benjizhujiming=benjiInetAddress.getHostName();
System.out.println("本机ip=="+benjiip);
System.out.println("本机的主机名=="+benjizhujiming);
//通过域名得到其他计算机的ip地址和主机名
//得到百度的ip地址和主机名
InetAddress baiduInetAddress=InetAddress.getByName("www.baidu.com");
//给出域名的时候是没有协议名称的
//InetAddress baiduInetAddress=InetAddress.getByName("https://www.baidu.com");
String baiduip=baiduInetAddress.getHostAddress();
String baiduzhujiming=baiduInetAddress.getHostName();
System.out.println("百度ip=="+baiduip);
System.out.println("百度的主机名=="+baiduzhujiming);
}
}
11.5.URL与URI的区别?
URI,通一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。
URI通常由三部分组成:
①资源的命名机制;
②存放资源的主机名;
③资源自身的名称。
例如:https://www.baidu.com/index.html
我们可以这样解释它:
①这是一个可以通过https协议访问的资源,
②位于主机www.baidu.com上,
③通过“/index.html”可以对该资源进行唯一标识
URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位符”。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL是URI概念的一种实现方式。
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“://”符号隔开,
第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
例如:https://www.baidu.com/index.html
从上面的例子来看,你可能觉得URI和URL可能是相同的概念,其实并不是,URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
Java中的URL类 【访问网络资源】
Java的URL网络类可以让你通过URL去访问网络服务器并获取资源。
URL(String spec) 从 String表示形成一个 URL对象。 |
URL(String protocol, String host, int port, String file) 创建 URL从指定对象 protocol , host , port数,和 file 。 |
实例方法
URLConnection |
openConnection() 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。 |
InputStream |
openStream() 打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。 |
例如:
package com.wangxing.test1;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
public class TestURL {
public static void main(String[] args) throws Exception{
//https://img14.360buyimg.com/n0/jfs/t1/137893/19/7221/217297/5f4d10a0E675688d0/1e3457aa3a2888bb.jpg
//URL(String spec) 从 String表示形成一个 URL对象。
URL url1=new URL("https://img14.360buyimg.com/n0/jfs/t1/137893/19/7221/217297/5f4d10a0E675688d0/1e3457aa3a2888bb.jpg");
//URL(String protocol, String host, int port, String file) 创建 URL从指定对象 protocol , host , port数,和 file 。
//URL url2=new URL("https","img14.360buyimg.com",80,"n0/jfs/t1/137893/19/7221/217297/5f4d10a0E675688d0/1e3457aa3a2888bb.jpg");
//InputStream openStream() 打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。
InputStream in=url1.openStream();
byte tempbyte[]=new byte[1024];
ByteArrayOutputStream out=new ByteArrayOutputStream();
int len=0;
while((len=in.read(tempbyte))!=-1) {
out.write(tempbyte);
}
out.close();
byte datebyte[]=out.toByteArray();
FileOutputStream fileout=new FileOutputStream(new File("tupian.jpg"));
fileout.write(datebyte);
fileout.close();
}
}