网络编程
1. 网络基础知识
1.1 计算机网络
指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件以及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
1.2 OSI 七层模型
OSI(Open System Interconnect)开放式系统互联,一般也称作OSI参考模型。是由ISO(国际标准化组织)研究的网络互联模型。早期网络在各大公司的内部,是互通的,但是在外部,是不相通的。因为没有 一个统一的规范,外部计算机之间互相传输数据和信息,对方是不能理解的。所以不能互联。意义在于推荐所有公司使用这个规范来控制网络,具有相同的范围,就可以互联。
第一层物理层:建立、维护、断开物理连接(网卡、网线、光纤、集线器、中继器、调制解调器)报文头部和上层数据信息。都是由二进制数组成的。物理层将这些二进制数字组成的比特流转换成电信号在网络 中传输。
第二层数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。将上层数据加上源和目的方的物理(MAC)地址封装成数据帧.
第三层网络层:进行逻辑地址寻址,实现不同网络之间的路径选择(路由器),将上层的数据加上源和目的方的逻辑(IP)地址封装成数据包,实现数据从源到目的地的传输
第四层传输层:定义传输数据的协议端口号,以及流控和差校验(防火墙),将上层的数据分片并加上端口号封装成数据段,或者通过对报文头中的端口识别,实现数据从源到目的地的传输
第五层会话层:建立、管理、中止会话,管理是否允许不同机器上的用户之间建立会话连接关系
第六层表示层:数据的表示、安全、压缩,将接收到的数据翻译成二进制数组成的计算机语言,并对数据进行压缩和解压,数据加密和解密工作。
第七层应用导:网络服务与最终用户的一个接口,人机交互窗口。
假设要玩《英雄联盟》游戏
第一层:首先要有网卡、有网线
第二层:要有能访问服务器的工具,mac地址、交换机
第三层:需要有路由器
第四层:访问的协议和端口号
第五层:可以和服务器进行网络连接
第六层:向服务器发送指令,对指令进行二进制的翻译。然后压缩、传到服务器进行解压
第七层:界面展示
OSI和设备的对应关系
物理层-------------网卡
数据链路层-------交换机
网络层-------------路由器
传输层-------------防火墙
应用层-------------计算机
上三层总称应用层:用来控制软件方面
下四层总称数据流层:用来管理硬件方面
数据传输过程
1.3 TCP / IP
Transfer(Transmission) Control Protocol/Internet Protocol (传输控制协议/网际(网络)协议):
指能够在多个不同网络间实现信息传输的协议簇。TCP/IP不仅指TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。对互联网中各部分进行通信 的标准和方法进行规定。是保 证网络数据信息及时、完整传的重要协议。
TCP/IP是一个四层的体系结构:应用层、传输层、网络层和物理+数据链路层
1.4 传输层协议
UDP协议:
面向非连接、传输不可靠(丢包(数据丢失))、用于传输少量数据(数据报包模式)、速度快。发送端和接收端
一个无连接的传输协议,称为用户数据报协议(User Datagram Protocol)。提供了一种无需建立连接可以发送封装的IP数据包的方法
协议比较简单,实现容易,但是没有确认机制,数据包发送出去,无法知道对方是否收到,可靠性较差,但效率比较高。包含报头在内的数据最大长度是64k
TCP协议:
TCP:面向连接(经历三次握手)、传输可靠(保证了数据正确性,数据顺序的正确性),用来传输数据量大,(流模式)、速度慢,建立连接开销大。服务端和客户端
是面向连接的、可靠的、基于字节流的通信协议。是一种有确认机制的协议,每发出一个数据包都要求确认,如果有一个数据包丢失,接收方不会进行确认,发送方就必须要重新发这个数据包。
TCP的三次握手:目的是为了确认客户端和服务端的收发功能是否正常
通过三次握手,主要确认4件事情:
1.客户端的发送功能
2.客户端的接收功能
3.服务端的发送功能
4.服务端的接收功能
第一次握手:客户端主动发起的:理解为客户端给服务器发了一个短信,客户端只知道自己把短信发送了,服务端是否收到了短信,并不知道。但是当第一次握手的短信发送到服务端时,服务端就知道自己 的接收功能是没问题的。主要就是确认了服务端接收功能是好用的。
第二次握手,是服务器端发起的:向客户发送数据,有4个参数。如果客户端正常接收了这个消息 ,现在就可以确认:客户端发送功能没有问题,客户端接收功能没有问题。
第三次握手,客户端发起的。客户端又向服务器发送4个参数,服务器收到,就可以确认,服务器端接收 功能是没有问题。
2. 网络编程
2.1 简介
对信息的发送到接收,中间传输为物理线路。主要的工作就是在发送端把信息通过规定的协议进行组装包,在接收端按照规定协议把数据包进行解析,从而提取对应的信息,达到通信的目的。中间最主要析就是数据包的组装、过滤、捕获、分析、处理。
2.2 三要素
-
协议:为计算机网络中进行数据交换而建立的各种规则、标准或约定的集合
- 协议:网络协议的简称,是计算机双方必须遵守的规则
- http:超文本传输协议(不收费)
- https:使用安全的套接字传输的超文本协议(收费)
- ftp:文件传输协议
- file:文件,本机电脑或者网上分享的文件
URI 与 URL
- URI:统一资源标识符,是用来标识某一个互联网资源名称的字符串
- 包含:主机名,端口,标识符,相对uri
- http://www.baidu.com/hello.html
- URL:统一资源定位符,是互联网的标准资源地址
- 包含:主机名,端口,标识符,具体路径
- http://ip:80/home/index.png
-
IP地址:IP地址(Internet Protocol Address),互联网协议地址,IP地址像我们家庭住址一样,如果要给一个人发快递,需要知道地址,才能由快递员把包裹送到。
IPV4: 以点进行划分,将一个地址划分成4个部分,每一组构成8位地址,可以算出42亿以上唯一地 址。
IPV6:并不是一种全新的技术,旨在替换IPV4地址,使用冒号分隔的十六进制数字,分为八个16位块, 构成一个128位的地址方案。
本机地址
localhost
127.0.0.1
本机ip(cmd – ipconfig)
InetAddress ip = InetAddress.getByName("LAPTOP-IQLK33VN"); System.out.println(ip.getHostName()); System.out.println(ip.getHostAddress());
-
端口号:设备和外界设备通信交流的出口, 计算机通过IP地址来代表其身份,只能表示某台特定的计算机。但是一台计算上可以同时提供多个服务,比如数据库服务\FTP服务\Web服务,通过端口号来区别在相同的计算上,所提供的不同服务。
同一台电脑中,不能同时出现同一个端口,端口冲突
21端口号 表示是FTP
23端口号 表示Telnet
25端口号 表示SMTP
80端口号 表示HTTP
从0-65535个端口号,1024以下的端口号保留给预定义的服务。
3 网络开发两种模式
C/S结构
Client/Server 客户端/服务器模式:服务器通常高性能的PC、工作站或小型机,并使用大型软件(数据库、WebLogic)。客户端通过安装客户端专用软件。合理分配了任务,给客户端和服务器,降低了系统的通讯开销,充分利用两端硬件环境优势。
B/S结构
Browser/Server 浏览器/服务器模式:是WEB兴起后的一种网络结构模式。WEB浏览器是客户端主要的应用软件。统一客户端,将系统功能的核心全部集中到服务器上,简化系统开发、维护和使用。
4. Socket套接字
4.1 简介
Socket(套接字):是进程间通信的一种方式,可以实现不同主机间的进程通信。应用程序通过Socket向网络发出请求或者响应网络请求。使用Socket来实现两个程序间的双向通讯,通迅的两端都有Socket,数据在两个Socket之间通过IO来进行传输
4.2 工作流程
4.3 基于TCP的Socket编程
4.3.1 实现聊天服务
Server端
public class Server {
public static void main(String[] args) throws IOException {
//创建了一个ServerSocket
ServerSocket server=new ServerSocket(1234);
System.out.println("等待连接...");
//方法阻塞
Socket client = server.accept();
/*InetAddress address = client.getInetAddress();
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
System.out.println(client.getPort());
System.out.println(client.getLocalPort());
System.out.println("已经有客户端连接...");*/
InputStream inputStream = client.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream);
BufferedReader reader=new BufferedReader(isr);
OutputStream outputStream = client.getOutputStream();
PrintWriter pw=new PrintWriter(outputStream);
Scanner scanner=new Scanner(System.in);
while (true) {
String str = reader.readLine();
System.out.println("【客户端】:" + str);
if ("bye".equals(str)){
break;
}
str=scanner.nextLine();
pw.println(str);
pw.flush();
if ("bye".equals(str)){
break;
}
}
reader.close();
client.close();
server.close();
}
}
Client端
public class Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("localhost",1234);
System.out.println("连接服务器");
OutputStream os=socket.getOutputStream();//获取输出流
PrintWriter pw=new PrintWriter(os);
InputStream inputStream = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream);
BufferedReader reader=new BufferedReader(isr);
Scanner scanner=new Scanner(System.in);
System.out.println("请录入聊天内容:");
while (true) {
String str = scanner.nextLine();
pw.println(str);
pw.flush();
if ("bye".equals(str)){
break;
}
str=reader.readLine();//接收服务器端发送的消息
System.out.println("【服务器端】:"+str);
if ("bye".equals(str)){
break;
}
}
reader.close();
pw.close();
socket.close();
}
}
4.3.2 基于TCP多线程上传文件
server端
public class UploadServer {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(8888);
while (true) {
new Thread(()->{
try {
Socket client = server.accept();
InputStream inputStream = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
FileOutputStream fos = new FileOutputStream("d:/aa/" +System.currentTimeMillis() + ".mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] b = new byte[1024];
int x;
while ((x = bis.read(b)) != -1) {
bos.write(b, 0, x);
}
bis.close();
bos.close();
System.out.println("接收成功");
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
//server.close();
}
}
Client端
public class UploadClient {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",8888);
FileInputStream fis=new FileInputStream("d:/aa/x.mp3");
BufferedInputStream bis=new BufferedInputStream(fis);
OutputStream oos=socket.getOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(oos);
byte[] b=new byte[1024];
int x;
while ((x=bis.read(b))!=-1){
bos.write(b,0,x);
}
bis.close();
bos.close();
System.out.println("上传成功");
socket.close();
}
}
4.4 基于UDP的socket编程
public class UDPSocket1 {
public static void main(String[] args) throws IOException {
//创建一个Socket
DatagramSocket socket=new DatagramSocket(2222);
String msg="有内鬼,终止交易";
//将字符串转成byte数组
byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
//创建一个数据包
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("localhost"),3333);
//调用send方法发送
socket.send(packet);
}
}
public class UDPSocket2 {
public static void main(String[] args) throws IOException {
DatagramSocket socket=new DatagramSocket(3333);
byte[] b=new byte[1024];
DatagramPacket packet=new DatagramPacket(b,b.length);
//接收消息
socket.receive(packet);
//将消息byte数组转换成字符串
String msg = new String(b, 0, packet.getLength(),
StandardCharsets.UTF_8);
System.out.println(msg);
}
}
4.5 URL 统一资源定位符
public class TestUrl {
public static void main(String[] args) throws IOException {
URL url=new
URL("https://inews.gtimg.com/newsapp_bt/0/15479502317/1000");
url=new URL("https://new.qq.com/rain/a/20221204A06PK600");
/* String protocol = url.getProtocol();
String host = url.getHost();
int port = url.getPort();
String file = url.getFile();
System.out.println("protocol = " + protocol);
System.out.println("host = " + host);
System.out.println("port = " + port);
System.out.println("file = " + file);*/
URLConnection urlConnection = url.openConnection();
InputStream is = urlConnection.getInputStream();
String fileName="d:/aa/qq.jpg";
fileName="d:/aa/qq.html";
FileOutputStream fis=new FileOutputStream(fileName);
byte[] b=new byte[1024];
int x;
while ((x=is.read(b))!=-1){
fis.write(b,0,x);
}
is.close();
fis.close();
}
}