DAY12.1 Java核心基础
网络编程
在互联网时代,网络在生活中处处可见,javaWeb占据了很大一部分
那如何实现javaWeb编程呢?
Web编程就是运行在同一个网络下面的终端,使得它们之间可以进行数据传输
计算机网络基本知识
计算机网络是通过硬件设施,传输媒介把不同物理地址上的计算机网络进行连接,形成一个资源共享和数据传输的网络系统
两台终端进行连接需要遵守规定的网络协议
- 语法:数据信息的结构
- 语义:描述请求、动作、响应
- 同步:动作的实现顺序
网络通信协议包括TCP/IP协议,IPX/SPX协议,NetBEUI协议,最常用的是TCP/IP协议
TCP/IP协议的分层思想
分层的优点:
- 维护性扩展性好
- 有利于系统的优化
分层思想好处是只需要关注自己的业务,不需要关注其它层的业务,把传递过来的数据处理传递给下一层即可
比如java代码的运行,它是运行在JVM虚拟机的,所以可以在不同的操作系统运行,做到了代码的跨平台性
TCP/IP协议分为 4 层:
- 应用层:整个体系结构中的顶层,通过应用之间的数据交互完成网络应用
- 传输层:为两台终端的数据交互提供数据传输服务
- 网络层:也叫 IP 层,负责为网络不同的终端提供通信服务
- 网络接口层:包括数据链路层和物理层,数据链路层:为数据传输提供链路协议,物理层指的是光纤、电缆、电磁波等真实存在的物理媒介,这些媒介可以传送网络信号
A发消息给B的数据传输路线图:
IP和端口
IP
IP地址:互联网中每个终端的唯一标识,网路请求可以根据这个找到具体的计算机
IP地址 = 网络地址,主机地址,网络地址的作用是找到主机所在的网络,主机地址是找到网络中的主机
IP地址分为5类,各类地址的IP数量不同
分类 | 范围 |
---|---|
A类 | 1.0.0.1~126.255.255.254 |
B类 | 128.0.0.1~191.255.255.254 |
C类 | 192.0.0.1~233.255.255.254 |
D类 | 224.0.0.1~239.255.255.254 |
E类 | 240.0.0.1~255.255.255.254 |
实际开发不用记住本机的IP地址
可以用127.0.0.1或者localhost表示本机地址
Java 中有专门的类来描述 IP 地址,这个类是 java.net.InetAddress
方法 | 描述 |
---|---|
public static InetAddress getLocalHost() | 获取本地主机的 InetAddress 对象 |
public static InetAddress getByName(String host) | 通过主机名称创建 InetAddress 对象 |
public String getName() | 获取主机名称 |
public String getHostAddress() | 获取主机 IP 地址 |
pubilc static InetAddress getByAddress(String host,byte[] addr) | 通过主机名称和 IP 地址创建 InetAddress 对象 |
public static InetAddress getByAddress(byte[] addr) | 通过 IP 地址创建 InetAddress 对象 |
端口
IP好比酒店的地址,那么端口就是房间号,IP地址需要结合端口来一起使用,不然找不到具体的应用
比如微信和QQ,他们两个软件运行在电脑的不同端口上面
还有我们常见的软件的默认端口
MySql:localhost:3306
Tomcat:localhost:8080
URL 和 URLConnection
URI(Uniform Resource Identifier)
网络资源是网络中真实存在的实体,比如文字、音频、图片、视频…
如何通过程序获取网络资源呢?
我们可以使用URI
URI:统一资源定位符,可以指向目标实体
Java.net包里面封装了一个类 URI ,使用 URI 的实例化对象就可以管理网络资源
public static void main(String[] args) {
URI uri = URI.create("http://localhost:8080/user/login");
System.out.println(uri);
System.out.println(uri.getHost());
System.out.println(uri.getPort());
System.out.println(uri.getPath());
}
URL(Uniform Resource Locator)
URL:统一资源位置,在 URI 的基础上进行了扩充,在定位资源的同时还提供了对应的网络地址,Java 也对 URL 进行了封装
方法 | 描述 |
---|---|
public URL(String protocol,String host,int port,String file) | 根据协议、IP地址、端口号、资源名称获取URL对象 |
public final InputStream openStream() | 获取输入流对象 |
public static void main(String[] args) throws Exception {
URL url = new URL("http", "127.0.0.1", 80, "/index.html");
System.out.println(url.getPath());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getProtocol());
InputStream inputStream = url.openStream();
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
URLConnection
URLConnection 用来描述 URL 指定资源的连接,是一个抽象类,常用的子类有 HttpURLConnection,URLConnection 底层是通过 HTTP 协议来处理的,它定义了访问远程网络资源的方法,通过 URLConnection 可以获取到 URL 资源的相关信息
方法 | 描述 |
---|---|
public int getContentLength() | 返回资源的长度,返回值为 int 类型 |
public long getContentLengthLong() | 返回资源的长度,返回值为 long 类型 |
public String getContentType() | 返回资源的类型 |
public abstract void connect() | 判断连接的打开或关闭状态 |
public InputStream getInputStream() | 获取输入流对象 |
URLConnection urlConnection = new URL("https://www.baidu.com").openConnection();
// 获取内容长度
System.out.println(urlConnection.getContentLength());
// 获取内容长度Long类型
System.out.println(urlConnection.getContentLengthLong());
// 获取类型
System.out.println(urlConnection.getContentType());
// 获取编码
System.out.println(urlConnection.getContentEncoding());
// 获取URL
System.out.println(urlConnection.getURL());
urlConnection.connect();
// 获取输入流
InputStream inputStream = urlConnection.getInputStream();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
TCP协议
TCP 协议是面向连接的运算层协议,比较复杂,应用程序在使用TCP协议之前必须建立连接,才能传输数据,数据传输完毕之后需要释放连接
就好比现实生活中的打电话,首先确保电话打通了才能进行通信,如果没有打通则阻塞,需要等待打通才能对话
TCP优缺点:
- 优点:安全可靠,数据不会丢失,并且数据是按照先后顺序依次到达
- 缺点:速度慢,效率低,常用于对于业务安全要求较高的场景
Java中如何使用 TCP 呢?
java中通过Socket类来建立TCP连接,使用这个类可以在服务端和客户端建立一个可靠的连接
Socket表示客户端,ServerSocket表示服务端
它们都在java.net包中
在服务端创建ServerSocket对象,通过对象的accept()方法可以接收到若干个表示客户端的Socket对象
代码示例 我们请看下一篇