网络编程 - 轻松入门
- 介绍
网络编程指的是,在网络通信协议下。实现不同计算机之间
的数据传输,例如 通信、聊天、视频通话 等。
1. 网络编程概述
学习网络编程过程 中我们可以将网络编程理解为
计算机之间的数据交互
但 前提是通过 网络协议
-
通信协议
规范数据交互的规则。 -
IP地址
计算机唯一标识,就像“收件人地址”和“寄件人地址”,负责指引数据的传输路径。 -
端口号
应用程序的唯一标识。 -
通信方式
- TCP(传输控制协议)
面向连接,提供安全可靠 的数据传输,代价是 性能开销较高。 - UDP(用户数据报协议)
无连接,更高效,代价是 可靠性较低。
- TCP(传输控制协议)
2. 软件架构
① C/S 结构 (Client/Server)
-
概念
客户端-服务器
架构。可以理解为需要下载
才能使用的 应用程序 所使用的架构 ↓ -
特点
需要下载客户端应用程序。 -
常见于
微信、QQ等。
② B/S 结构
- 概念:浏览器-服务器架构。
- 特点:通过浏览器访问,不需要单独安装客户端。
- 常见场景:网页应用,如电子邮件服务。
3. 核心概念:服务器与通信协议
① 服务器
可用于提供服务的计算机,用于处理客户端 请求
并提供 响应
我们的电脑也是服务器,但是提供服务范围较小,一般是我们自己
而服务器泛指范围较大的,用于托管平台,存储大量数据或支持网络应用
- Web服务器:提供网页浏览服务(通过 HTTP 协议)
- 数据库服务器:处理和管理数据存储,供客户端查询和修改。
- 文件服务器:提供文件存储与共享服务。
- 邮件服务器:管理电子邮件的发送和接收。
服务器核心 在于接受客户端 请求
并提供 响应
的服务,这种服务是多样的
② 通信协议
两台计算机完成数据交互需遵守通信协议:
- TCP 协议:连接前需建立连接(三次握手),断开时需关闭连接(四次挥手),确保传输的可靠性。
- UDP 协议:无需连接,快速但可能丢包,常用于视频通话等实时性要求较高的场景。
③ 三次握手四次挥手
“握手”用于连接,“挥手”用于断开。以下是两者的具体过程:
- 三次握手(连接建立过程)
“三次握手”指在 TCP 协议中,客户端与服务器之间建立连接的过程- 第一次握手(SYN)
客户端向服务器发送一个SYN(同步序列号)包,请求建立连接,并告诉服务器自己的初始序列号。 - 第二次握手(SYN-ACK)
服务器收到SYN包后,回复一个SYN-ACK包,表示同意建立连接,同时告知自己的初始序列号。 - 第三次握手(ACK):
客户端收到服务器的SYN-ACK包后,发送一个ACK包,确认服务器的序列号。此时,连接建立完成。
- 第一次握手(SYN)
通过“三次握手”,双方确认了彼此的发送和接收能力
术语解释 (SYN、SYN-ACK、ACK)
- SYN(Synchronize:“同步”)
可以理解为客户端向服务器发出的打招呼请求它的作用是发起通信请求,并告诉对方:“我准备好了,你也准备好了吗?”
- SYN-ACK(Synchronize-Acknowledge:“同步+确认”)
服务器收到客户端的“打招呼”给出的回应它的作用是告诉客户端:“我同意通信,但需要确认你也能收到我的回应。”
- ACK(Acknowledge,意思是“确认”)
是客户端收到服务器的回应后,给出的确认信息它的作用是告诉服务器“好的,我确认收到了你的准备,现在可以开始通信了!”
完成最后的确认,确保双方都准备好建立连接。
- 四次挥手(连接断开过程)
“四次挥手”指在 TCP 协议中,客户端与服务器之间断开连接的过程- 第一次挥手(FIN):
客户端发送一个FIN(终止连接)包,表示希望关闭数据传输。 - 第二次挥手(ACK):
服务器收到FIN包后,回复一个ACK包,表示收到了断开请求,但可能还有数据需要处理。 - 第三次挥手(FIN):
服务器处理完所有数据后,发送一个FIN包,表示可以断开连接。 - 第四次挥手(ACK):
客户端收到服务器的FIN包后,回复一个ACK包,确认连接断开。此时,连接完全关闭。
- 第一次挥手(FIN):
“四次挥手”比“三次握手”多一步,是因为TCP连接是双向传输的,需要双方分别关闭自己的传输通道。
术语解释 (FIN、剩下上方已解释)
FIN(Finish:“结束”)是用来表示一方准备关闭连接的信号。
它的作用是告知对方“我已经说完了,现在想挂电话了”,并通知当前一方已经完成数据发送,准备断开连接。
4. 快速上手 UDP、TCP 网络编程程序
① Socket 套接字
**套接字Socket **
可以简单理解为:一种通信的“工具”或“接口”,用于在网络上两台计算机之间进行数据交换。
- 在编程中,它是一个“中间人”,帮助应用程序通过网络发送或接收数据。
- 通过它,计算机之间就像打电话一样,可以 建立连接、发送消息、接收消息。
打个比方
打电话给朋友 :
- 你需要一个“电话”(套接字)才能进行交流;
- 套接字知道对方的“电话号码”(IP 地址 + 端口号);
- 通过这个工具,你们可以建立通信并传递信息。
所以,套接字是网络通信中应用层(程序)和传输层(协议)之间的桥梁。
① UDP 编程
特点:无需建立连接,即使接收端未在线,也可发送数据。
-
套接字类型:
DatagramSocket
-
客户端代码:
// 创建 UDP 客户端,发送数据到服务器
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws Exception {
// 1. 创建 DatagramSocket 实例
DatagramSocket socket = new DatagramSocket();
// 2. 准备要发送的数据
byte[] bytes = "你好".getBytes(); // 将字符串转换为字节数组
// 3. 指定接收端的 IP 地址和端口号
InetAddress ip = InetAddress.getByName("127.0.0.1"); // 本地 IP 地址(回环地址)
// 4. 创建数据报包(DatagramPacket),封装数据、目标地址和端口号
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, ip, 6666);
// 5. 发送数据报包
socket.send(packet);
// 6. 关流,释放资源
socket.close();
}
}
- 服务端代码:
// 创建 UDP 服务端,接收客户端发送的数据
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws Exception {
// 1. 创建 DatagramSocket 实例,并绑定到指定端口(6666)
DatagramSocket socket = new DatagramSocket(6666);
// 2. 准备缓冲区,用于存储接收到的数据
byte[] bytes = new byte[1024]; // 缓冲区大小为 1024 字节
// 3. 创建数据报包(DatagramPacket),用于接收数据
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
// 4. 接收数据(阻塞方法,直到接收到数据为止)
socket.receive(packet);
// 5. 解析接收到的数据,并打印
System.out.println(new String(packet.getData(), 0, packet.getLength())); // 转换为字符串并输出
// 6. 关闭套接字,释放资源
socket.close();
}
}
② TCP 编程
特点 传输可靠,需建立连接。
-
套接字类型
Socket
和ServerSocket
。 -
客户端代码
// 创建 UDP 服务端,接收客户端发送的数据
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws Exception {
// 1. 创建 DatagramSocket 实例,并绑定到指定端口(6666)
DatagramSocket socket = new DatagramSocket(6666);
// 2. 准备缓冲区,用于存储接收到的数据
byte[] bytes = new byte[1024]; // 缓冲区大小为 1024 字节
// 3. 创建数据报包(DatagramPacket),用于接收数据
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
// 4. 接收数据(阻塞方法,直到接收到数据为止)
socket.receive(packet);
// 5. 解析接收到的数据,并打印
System.out.println(new String(packet.getData(), 0, packet.getLength())); // 转换为字符串并输出
// 6. 关闭套接字,释放资源
socket.close();
}
}
- 服务端代码:
// 创建 TCP 客户端,与服务端建立连接并通信
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception {
// 1. 创建 Socket 对象,与服务端建立连接(指定服务端 IP 和端口号)
Socket socket = new Socket("127.0.0.1", 6666); // 连接本地的 6666 端口
// 2. 获取输出流,用于发送数据到服务端
OutputStream os = socket.getOutputStream();
os.write("你好,服务器".getBytes()); // 发送数据(将字符串转为字节数组)
// 3. 获取输入流,用于接收服务端的响应
InputStream is = socket.getInputStream();
byte[] response = new byte[1024]; // 创建缓冲区存储响应数据
int len = is.read(response); // 读取服务端发送的数据(阻塞方法)
// 4. 解析响应数据,并打印
System.out.println(new String(response, 0, len)); // 输出服务端的响应
// 5. 关闭 Socket,释放资源
socket.close();
}
}
5. 小结
-
网络编程概述
网络编程实现计算机之间的数据交互,依赖通信协议,核心要素包括:-
IP地址:计算机的唯一标识。
-
端口号:标识应用程序的入口。
-
通信协议:TCP提供可靠连接,UDP追求高效传输。
-
-
软件架构
-
C/S架构:客户端-服务器模式,常见于微信、QQ等需安装应用的场景。
-
B/S架构:浏览器-服务器模式,适用于网页应用,如邮箱服务。
-
-
核心概念
-
服务器:响应客户端请求的计算机,提供多样化服务(如Web、数据库)。
-
通信协议:
- TCP:通过三次握手建立连接,四次挥手断开连接,确保传输可靠。
- UDP:无需连接,快速高效,适合视频通话等场景。
-
-
快速上手
-
UDP编程:使用
DatagramSocket
快速发送数据。 -
TCP编程:基于
Socket
和ServerSocket
,建立可靠连接。
-
end…
如果这篇文章帮到你, 帮忙点个关注呗, 不想那那那点赞或收藏也行鸭 (。•̀ᴗ-)✧ ~
'(இ﹏இ`。)