java基础 网络编程
一、计算机网络基础
1、计算机网络定义
把分布在不同区域的计算机与专门的外部设备通过通信线路连接成复杂的网络系统, 众多计算机之间可以方便的互相传输信息,数据共享
2、计算机网络主要功能:
资源共享
信息传输与集中处理
均衡负荷与分布处理
综合信息服务
计算机之间需要数据传输,离不开网络通信协议,网络通信协议就是 双方在传输数据时的约定
3、网络通信协议定义:
计算机在数据传输时的通用标准 。约定了他们的传输速率,传输代码、代码结构,出错控制等标准。
根据国际约束的协议分为网络通信协议的七层协议,按照实际应用也可分为四层协议
七层从下往上 : 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
四层协议从下往上: 物理+数据链路层 、网络层(IP层)、传输层、应用层
由于网络传输本身是比较复杂的过程,Java 对每一层进行封装,对每一层提供对应的API ,使我们在进行网络传输时不需要跟踪底层协议,只需对每一层提供的API掌握,同时数据传输的过程和 文件流一样操作,从而简化该过程。 所以网络传输会使用流、多线程的概念。
二、Java的网络编程
Java的网络编程包 java.net.*
网络层: 掌握网络IP 和 端口号 java.net.InetAddress \Inet4Address\Inet6Address
IP的定义: IP(Internet Protocol) 互联网协议, 在全球互联网范围内每一个IP地址表示一台独立的计算机(广域网内) ,IPv4由四个段组成,每一个段的数都从0-255
通过一个IP地址可以路由到唯一的计算机。
端口号(PORT): 一台计算机上可运行多个应用程序,通过端口号区分该计算机的指定应用程序, 同一个计算机下,不同应用程序,端口号一定不同。 端口号的范围(0-65535)
常用端口号 :
IP层的类:
java.net. InetAddress
常用方法
getLocalHost() : 获取本地IP对象
getHostAddress():获取IP地址
getHostName():获取计算机名
getAddress():获取ip地址的数组表现形式
static getByName(参数) :通过ip地址或计算机名 返回一个InetAddress对象
//确定主机名称的IP地址。
// 获取本机 LocalHost 表示本机ip
InetAddress inet = InetAddress.getLocalHost();
System.out.println("主机地址:"+inet.getHostAddress());
System.out.println("主机名:"+inet.getHostName());
System.out.println("主机名IP数组:"+
Arrays.toString( inet.getAddress()));
// 也可以通过ip地址获取InetAddress对象
InetAddress inet2= InetAddress.getByName("DESKTOP-346CK63");
//获取ip地址
System.out.println(inet2.getHostAddress());
InetAddress inet3 = InetAddress.getByName("192.168.7.189");
//获取计算机名
System.out.println(inet3.getHostName());
InetAddress inet4 = InetAddress.getByName("192.168.7.103");
System.out.println("对方的计算机名:"+ inet4.getHostName());
URL类:
URL全称 统一资源定位符,用于访问互联网上的资源地址,也称为 网址,
完成的URL地址包括以下部分
协议名://ip地址:端口号/文件路径/文件名
例如: http://47.100.182.246:8080/robot/
协议名: http 、https、ftp协议
URL : url的路由对象
URLConnection : url的连接对象, 可获取输入流
常用方法:
getConnect() : 获取连接对象的内容
URL url = new URL("https://www.baidu.com/");
// 获取根据ip + 端口 + 协议 + 文件组成URL
// URL url2 = new URL("http","47.100.182.246",8080,"/robot");
//获取连接 (与该地址的连接)
URLConnection conn = url.openConnection();
// 获取这里的资源,首先需要获取输入流 ,下载远程资源相当于IO流操作
InputStream is = conn.getInputStream();
// 包装成一个字符流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str=null;
while((str =br.readLine()) !=null){
System.out.println(str);
}
br.close();
下载文件 案例
public static void main(String[] args) throws IOException {
//https://zhuanlan.zhihu.com/p/285529011
// 1、创建连接
URL url = new URL("https://zhuanlan.zhihu.com/p/285529011");
System.out.println(url);
// 2、打开连接
InputStream is = url.openStream();
// 定义文件输出流
FileOutputStream fos = new FileOutputStream("d:/zhihu.html");
byte [] b = new byte[1024];
int len = 0;
while( (len =is.read(b)) !=-1){
fos.write(b,0,len);
}
System.out.println("文件下载 成功");
fos.close();
is.close();
}
传输层(TCP/UDP)
传输层用于数据的传输,在数据传输过程中根据数据的可靠性可分为两类,
1、基于TCP的传输
TCP特点: 两台计算机之间建立可靠连接,基于Socket的通道一旦建立,则数据可通过字节流的方式传输到另一方, 安全的可靠协议 ,
2、基于UDP的传输
UDP特点: 它面向无连接的协议,不保证数据的可靠性,传播速度比较快
TCP和UDP的区别