java2_day06网络编程
目录
-
网络编程概述
-
网络通信要素概述
-
通信要素1:IP和端口号
-
通信要素2:网络协议
-
TCP网络编程
-
UDP网络编程
-
URL编程
1 网络编程概述
-
Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
-
Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
1.1 网络基础
-
计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
-
网络编程的目的: 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
-
网络编程中有两个主要的问题:
-
如何准确地定位网络上一台或多台主机:定位主机上的特定的应用
-
找到主机后如何可靠高效地进行数据传输
-
2 网络通信要素概述
-
IP和端口号
-
网络通信协议
2.1 如何实现网络中的主机相互通信
-
通信双方地址
-
IP:网络中唯一定位的一台主机
-
端口号:定位这台主机的哪个应用程序在通讯
-
-
一定的规则(即:网络通信协议。有两套参考模型)
-
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
-
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准
-
3 IP和端口
-
IP地址: 在java中使用InetAddress类代表IP
-
唯一的标识Internet上的计算机(通信实体)
-
本地回环地址(hostAddress): 127.0.0.1 主机名(hostName): localhost
-
IP地址分类方式1: IPV4和IPV6
-
IPV4: 4个字节组成,4个0-255。 大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1
-
IPV6: 128位 (16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(: )分开,如: 3ffe:3201:1401:1280c8f.fe4d:db39:1984
-
-
IP地址分类方式2: 公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专为组织机 构内部使用
-
特点: 不易记忆
-
域名: www.baidu.com
-
package com.xin.java1;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/27 10:18
* Description:
*一、网络编程中有两个主要的问题:
* - 如何准确地定位网络上一台或多台主机:定位主机上的特定的应用
* - 找到主机后如何可靠高效地进行数据传输
*二、网络编程中的两个要素
* 1. 对应问题一: IP和端口号
* 2. 对应问题二: 提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
*三、通信要素一: IP和端口号
* 1. IP: 唯一的标识Internet上的计算机(通信实体)
* 2. 在java中使用InetAddress类代表IP
* 3. IP分类: IPv4 和IPv6; 万维网和局域网
* 4. 域名: www.baidu.com
* 5. 本地回路地址:127.0.0.1 对应着: localhost(相当于域名)
* 6. 如何实例化InetAddress:;两个方法:getByName(String host)、getLocalHost()
* 两个常用方法:getHostName()/getHostAddress()
* 7. 端口号:正在计算机上运行的进程
* 要求:不同的进程有不同的端口号
* 范围: 被规定为一个16位的整数0-65535
*8. 端口号与IP地址的组合得出一个网络套接字: Socket.
*/
public class InetAddressTest {
public static void main(String[] args) {
try {
InetAddress inet1 = InetAddress.getByName("192.168.10.14"); //具体的IP地址
System.out.println(inet1); ///192.168.10.14
InetAddress inet2 = InetAddress.getByName("www.atguigu.com"); //填写域名或者地址都行
System.out.println(inet2); //www.atguigu.com/120.201.240.42
InetAddress inet3 = InetAddress.getByName("localhost");
System.out.println(inet3); //localhost/127.0.0.1,表示的是回环地址
//获取本机的IP地址
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost); //Wu001/192.168.91.1,表示的是本机在局域网中的地址
//getHostName()获取域名
System.out.println(inet2.getHostName()); //www.atguigu.com
//getHostAddress()获取地址
System.out.println(inet2.getHostAddress()); //120.201.240.42
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
-
端口号标识正在计算机上运行的进程(程序)
-
不同的进程有不同的端口号
-
被规定为一个16位的整数0~65535。
-
端口分类:
-
公认端口: 0~1023。被预先定义的服务通信占用(如: HTTP占用端口80,FTP 占用端口21,Telnet占用端口23)
-
注册端口: 1024~49151。 分配给用户进程或应用程序。( 如: Tomcat占用端口8080,MySQL占用端口3306,Oracle 占用端口1521等)。
-
动态/私有端口: 49152~65535。
-
-
-
端口号与IP地址的组合得出一个网络套接字: Socket.
4 网络通信协议
-
网络通信协议 计算机网络中实现通信必须有一-些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
-
问题: 网络协议太复杂 计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩,解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?
-
通信协议分层的思想 在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一 层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
-
TCP/IP协议簇
-
传输层协议中有两个非常重要的协议:
-
传输控制协议TCP(Transmission Control Protocol)。比如打电话
-
用户数据报协议UDP(User Datagram Protocol)。比如应用在视频播放,丢几帧图片不影响。
-
TCP三次握手,实现多次信息确认,建立链接,保证通信可靠。
TCP四次挥手,释放连接
第一步客户端发送请求断开信息,第二步服务器端收到断开请求,第三步服务器已经断开,第四步再次发送信息确认是否断开。
-
TCP/IP以其两个主要协议: 传输控制协议(TCP) 和 网络互联协议(IP) 而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
-
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
-
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
5 TCP网络编程
-
客户端先执行会报错,因为要执行三次握手,服务器端不打开,无法执行握手。
实例1:客户端发送内容给服务端,服务端将内容打印到控制台上
package com.xin.java1;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/27 14:56
* Description:
* 实现TCP的网络编程
* 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上
*/
public class TCPTest1 {
//客户端