一.⽹络编程基础1.1 为什么需要⽹络编程⸺丰富的⽹络资源⽤⼾在浏览器中打开在线视频⽹站如看视频实质是通过⽹络获取到⽹络上的⼀个视频资源。与本地打开视频⽂件类似只是视频⽂件这个资源的来源是⽹络。相⽐本地资源来说⽹络提供了更为丰富的网络资源。所谓的⽹络资源其实就是在⽹络中可以获取的各种数据资源。⽽所有的⽹络资源都是通过⽹络编程来进⾏数据传输的1.2什么是⽹络编程⽹络编程指⽹络上的主机通过不同的进程以编程的⽅式实现⽹络通信或称为⽹络数据传输。只要满⾜进程不同就⾏所以即便是同⼀个主机只要是不同进程基于⽹络来传输数据也属于⽹络编程。特殊的对于开发来说在条件有限的情况下⼀般也都是在⼀个主机中运⾏多个进程来完成⽹络编程。但是我们⼀定要明确我们的⽬的是提供⽹络上不同主机基于⽹络来传输数据资源• 进程A编程来获取⽹络资源• 进程B编程来提供⽹络资源1.3⽹络编程中的基本概念1.31发送端和接收端在⼀次⽹络数据传输时发送端数据的发送⽅进程称为发送端。发送端主机即⽹络通信中的源主机。接收端数据的接收⽅进程称为接收端。接收端主机即⽹络通信中的⽬的主机。收发端发送端和接收端两端也简称为收发端。注意发送端和接收端只是相对的只是⼀次⽹络数据传输产⽣数据流向后的概念。1.32请求和响应⼀般来说获取⼀个⽹络资源涉及到两次⽹络数据传输• 第⼀次请求数据的发送• 第⼆次响应数据的发送。好⽐在快餐店点⼀份炒饭 先要发起请求点⼀份炒饭再有快餐店提供的对应响应提供⼀份炒饭1.33客⼾端和服务端服务端在常⻅的⽹络数据传输场景下把提供服务的⼀⽅进程称为服务端可以提供对外服务。客⼾端获取服务的⼀⽅进程称为客⼾端。对于服务来说⼀般是提供• 客⼾端获取服务资源• 客⼾端保存资源在服务端好⽐在银⾏办事 • 银⾏提供存款服务⽤⼾客⼾端保存资源现⾦在银⾏服务端 • 银⾏提供取款服务⽤⼾客⼾端获取服务端资源银⾏替⽤⼾保管的现⾦二. 常⻅的客⼾端服务端模型最常⻅的场景客⼾端是指给⽤⼾使⽤的程序服务端是提供⽤⼾服务的程序客⼾端先发送请求到服务端服务端根据请求数据执⾏相应的业务处理服务端返回响应发送业务处理结果客⼾端根据响应数据展⽰处理结果展⽰获取的资源或提⽰保存资源的处理结果三.Socket套接字1.概念Socket套接字是由系统提供⽤于⽹络通信的技术是基于TCP/IP协议的⽹络通信的基本操作单元。基于Socket套接字的⽹络程序开发就是⽹络编程。2.分类Socket套接字主要针对传输层协议划分为如下三类流套接字使⽤传输层TCP协议TCP即Transmission Control Protocol传输控制协议传输层协议。以下为TCP的特点• 有连接• 可靠传输• ⾯向字节流• 有接收缓冲区也有发送缓冲区• ⼤⼩不限对于字节流来说可以简单的理解为传输数据是基于IO流流式数据的特征就是在IO流没有关闭的情况下是⽆边界的数据可以多次发送也可以分开多次接收。数据报套接字使⽤传输层UDP协议UDP即User Datagram Protocol⽤⼾数据报协议传输层协议。以下为UDP的特点• ⽆连接• 不可靠传输• ⾯向数据报• 有接收缓冲区⽆发送缓冲区• ⼤⼩受限⼀次最多传输64k对于数据报来说可以简单的理解为传输数据是⼀块⼀块的发送⼀块数据假如100个字节必须⼀次发送接收也必须⼀次接收100个字节⽽不能分100次每次接收1个字节。原始套接字原始套接字⽤于⾃定义传输层协议⽤于读写内核没有处理的IP协议数据四.Java数据报套接字通信模型对于UDP协议来说具有⽆连接⾯向数据报的特征即每次都是没有建⽴连接并且⼀次发送全部数据报⼀次接收全部的数据报。java中使⽤UDP协议通信主要基于DatagramSocket类来创建数据报套接字并使⽤DatagramPacket 作为发送或接收的UDP数据报。以上只是⼀次发送端的UDP数据报发送及接收端的数据报接收并没有返回的数据。也就是只有请求没有响应。对于⼀个服务端来说重要的是提供多个客⼾端的请求处理及响应![[Pasted客⼾端和服务端开发时经常是基于⼀个主机开启两个进程作为客⼾端和服务端但真实的场景⼀般都是不同主机。注意⽬的IP和⽬的端⼝号标识了⼀次数据传输时要发送数据的终点主机和进程Socket编程我们是使⽤流套接字和数据报套接字基于传输层的TCP或UDP协议但应⽤层协议也需要考虑这块我们在后续来说明如何设计应⽤层协议。关于端⼝被占⽤的问题如果⼀个进程A已经绑定了⼀个端⼝再启动⼀个进程B绑定该端⼝就会报错这种情况也叫端⼝被占⽤。对于java进程来说端⼝被占⽤的常⻅报错信息如下此时需要检查进程B绑定的是哪个端⼝再查看该端⼝被哪个进程占⽤。以下为通过端⼝号查进程的⽅式在cmd输⼊ netstat -ano | findstr 端⼝号 则可以显⽰对应进程的pid。如以下命令显⽰了8888进程的pid在任务管理器中通过pid查找进程解决端⼝被占⽤的问题◦ 如果占⽤端⼝的进程A不需要运⾏就可以关闭A后再启动需要绑定该端⼝的进程B◦ 如果需要运⾏A进程则可以修改进程B的绑定端⼝换为其他没有使⽤的端⼝。5.⻓短连接TCP发送数据时需要先建⽴连接什么时候关闭连接就决定是短连接还是⻓连接短连接每次接收到数据并返回响应后都关闭连接即是短连接。也就是说短连接只能⼀次收发数据。客户端发起三次握手建立 TCP 连接发送一次请求 服务端返回响应四次挥手关闭连接每次交互都要重复「建连→传数据→断连」✅ 优点服务端资源压力小无大量空闲连接堆积实现简单无需心跳、连接管理天然均衡负载请求分散新建连接❌ 缺点高频请求下大量握手挥手网络开销大、延迟高大量瞬时连接会占用服务器端口资源⻓连接不关闭连接⼀直保持连接状态双⽅不停的收发数据即是⻓连接。也就是说⻓连接可以多次收发数据。三次握手建连只做一次反复多次收发请求 / 响应长时间无数据才触发关闭连接一般会配套心跳包保活防止防火墙断开空闲连接✅ 优点频繁交互场景性能极高省去重复建连耗时支持双向实时推送服务端主动发消息给客户端聊天 / 直播❌ 缺点服务端需维护海量连接消耗内存、文件句柄高并发容易打满 fd 上限必须处理心跳、断线重连、连接超时回收逻辑复杂防火墙 / 路由器会自动切断长时间空闲长连接对⽐以上⻓短连接两者区别如下对比维度短连接长连接连接生命周期单次数据交互即销毁连接复用多次传输共用一条链路握手挥手开销每次通信都要 3 次握手 4 次挥手频繁消耗 CPU / 网络仅首次建连有握手开销后续无重复建断资源占用服务端无需维持大量空闲连接内存开销小服务端要持有大量 Socket 连接占用文件描述符、内存适用并发模型高并发、短请求静态页面、简单查询持续交互、高频通信聊天、数据库、实时推送保活机制不需要必须心跳包TCP Keepalive / 业务心跳防止被防火墙切断网络延迟每次请求都有建连延迟频繁请求性能差首次有延迟后续请求零建连延迟响应更快故障感知每次新建连接天然感知服务端是否存活连接断了才发现需心跳检测离线
网络编程及其模型
发布时间:2026/7/5 6:11:07
一.⽹络编程基础1.1 为什么需要⽹络编程⸺丰富的⽹络资源⽤⼾在浏览器中打开在线视频⽹站如看视频实质是通过⽹络获取到⽹络上的⼀个视频资源。与本地打开视频⽂件类似只是视频⽂件这个资源的来源是⽹络。相⽐本地资源来说⽹络提供了更为丰富的网络资源。所谓的⽹络资源其实就是在⽹络中可以获取的各种数据资源。⽽所有的⽹络资源都是通过⽹络编程来进⾏数据传输的1.2什么是⽹络编程⽹络编程指⽹络上的主机通过不同的进程以编程的⽅式实现⽹络通信或称为⽹络数据传输。只要满⾜进程不同就⾏所以即便是同⼀个主机只要是不同进程基于⽹络来传输数据也属于⽹络编程。特殊的对于开发来说在条件有限的情况下⼀般也都是在⼀个主机中运⾏多个进程来完成⽹络编程。但是我们⼀定要明确我们的⽬的是提供⽹络上不同主机基于⽹络来传输数据资源• 进程A编程来获取⽹络资源• 进程B编程来提供⽹络资源1.3⽹络编程中的基本概念1.31发送端和接收端在⼀次⽹络数据传输时发送端数据的发送⽅进程称为发送端。发送端主机即⽹络通信中的源主机。接收端数据的接收⽅进程称为接收端。接收端主机即⽹络通信中的⽬的主机。收发端发送端和接收端两端也简称为收发端。注意发送端和接收端只是相对的只是⼀次⽹络数据传输产⽣数据流向后的概念。1.32请求和响应⼀般来说获取⼀个⽹络资源涉及到两次⽹络数据传输• 第⼀次请求数据的发送• 第⼆次响应数据的发送。好⽐在快餐店点⼀份炒饭 先要发起请求点⼀份炒饭再有快餐店提供的对应响应提供⼀份炒饭1.33客⼾端和服务端服务端在常⻅的⽹络数据传输场景下把提供服务的⼀⽅进程称为服务端可以提供对外服务。客⼾端获取服务的⼀⽅进程称为客⼾端。对于服务来说⼀般是提供• 客⼾端获取服务资源• 客⼾端保存资源在服务端好⽐在银⾏办事 • 银⾏提供存款服务⽤⼾客⼾端保存资源现⾦在银⾏服务端 • 银⾏提供取款服务⽤⼾客⼾端获取服务端资源银⾏替⽤⼾保管的现⾦二. 常⻅的客⼾端服务端模型最常⻅的场景客⼾端是指给⽤⼾使⽤的程序服务端是提供⽤⼾服务的程序客⼾端先发送请求到服务端服务端根据请求数据执⾏相应的业务处理服务端返回响应发送业务处理结果客⼾端根据响应数据展⽰处理结果展⽰获取的资源或提⽰保存资源的处理结果三.Socket套接字1.概念Socket套接字是由系统提供⽤于⽹络通信的技术是基于TCP/IP协议的⽹络通信的基本操作单元。基于Socket套接字的⽹络程序开发就是⽹络编程。2.分类Socket套接字主要针对传输层协议划分为如下三类流套接字使⽤传输层TCP协议TCP即Transmission Control Protocol传输控制协议传输层协议。以下为TCP的特点• 有连接• 可靠传输• ⾯向字节流• 有接收缓冲区也有发送缓冲区• ⼤⼩不限对于字节流来说可以简单的理解为传输数据是基于IO流流式数据的特征就是在IO流没有关闭的情况下是⽆边界的数据可以多次发送也可以分开多次接收。数据报套接字使⽤传输层UDP协议UDP即User Datagram Protocol⽤⼾数据报协议传输层协议。以下为UDP的特点• ⽆连接• 不可靠传输• ⾯向数据报• 有接收缓冲区⽆发送缓冲区• ⼤⼩受限⼀次最多传输64k对于数据报来说可以简单的理解为传输数据是⼀块⼀块的发送⼀块数据假如100个字节必须⼀次发送接收也必须⼀次接收100个字节⽽不能分100次每次接收1个字节。原始套接字原始套接字⽤于⾃定义传输层协议⽤于读写内核没有处理的IP协议数据四.Java数据报套接字通信模型对于UDP协议来说具有⽆连接⾯向数据报的特征即每次都是没有建⽴连接并且⼀次发送全部数据报⼀次接收全部的数据报。java中使⽤UDP协议通信主要基于DatagramSocket类来创建数据报套接字并使⽤DatagramPacket 作为发送或接收的UDP数据报。以上只是⼀次发送端的UDP数据报发送及接收端的数据报接收并没有返回的数据。也就是只有请求没有响应。对于⼀个服务端来说重要的是提供多个客⼾端的请求处理及响应![[Pasted客⼾端和服务端开发时经常是基于⼀个主机开启两个进程作为客⼾端和服务端但真实的场景⼀般都是不同主机。注意⽬的IP和⽬的端⼝号标识了⼀次数据传输时要发送数据的终点主机和进程Socket编程我们是使⽤流套接字和数据报套接字基于传输层的TCP或UDP协议但应⽤层协议也需要考虑这块我们在后续来说明如何设计应⽤层协议。关于端⼝被占⽤的问题如果⼀个进程A已经绑定了⼀个端⼝再启动⼀个进程B绑定该端⼝就会报错这种情况也叫端⼝被占⽤。对于java进程来说端⼝被占⽤的常⻅报错信息如下此时需要检查进程B绑定的是哪个端⼝再查看该端⼝被哪个进程占⽤。以下为通过端⼝号查进程的⽅式在cmd输⼊ netstat -ano | findstr 端⼝号 则可以显⽰对应进程的pid。如以下命令显⽰了8888进程的pid在任务管理器中通过pid查找进程解决端⼝被占⽤的问题◦ 如果占⽤端⼝的进程A不需要运⾏就可以关闭A后再启动需要绑定该端⼝的进程B◦ 如果需要运⾏A进程则可以修改进程B的绑定端⼝换为其他没有使⽤的端⼝。5.⻓短连接TCP发送数据时需要先建⽴连接什么时候关闭连接就决定是短连接还是⻓连接短连接每次接收到数据并返回响应后都关闭连接即是短连接。也就是说短连接只能⼀次收发数据。客户端发起三次握手建立 TCP 连接发送一次请求 服务端返回响应四次挥手关闭连接每次交互都要重复「建连→传数据→断连」✅ 优点服务端资源压力小无大量空闲连接堆积实现简单无需心跳、连接管理天然均衡负载请求分散新建连接❌ 缺点高频请求下大量握手挥手网络开销大、延迟高大量瞬时连接会占用服务器端口资源⻓连接不关闭连接⼀直保持连接状态双⽅不停的收发数据即是⻓连接。也就是说⻓连接可以多次收发数据。三次握手建连只做一次反复多次收发请求 / 响应长时间无数据才触发关闭连接一般会配套心跳包保活防止防火墙断开空闲连接✅ 优点频繁交互场景性能极高省去重复建连耗时支持双向实时推送服务端主动发消息给客户端聊天 / 直播❌ 缺点服务端需维护海量连接消耗内存、文件句柄高并发容易打满 fd 上限必须处理心跳、断线重连、连接超时回收逻辑复杂防火墙 / 路由器会自动切断长时间空闲长连接对⽐以上⻓短连接两者区别如下对比维度短连接长连接连接生命周期单次数据交互即销毁连接复用多次传输共用一条链路握手挥手开销每次通信都要 3 次握手 4 次挥手频繁消耗 CPU / 网络仅首次建连有握手开销后续无重复建断资源占用服务端无需维持大量空闲连接内存开销小服务端要持有大量 Socket 连接占用文件描述符、内存适用并发模型高并发、短请求静态页面、简单查询持续交互、高频通信聊天、数据库、实时推送保活机制不需要必须心跳包TCP Keepalive / 业务心跳防止被防火墙切断网络延迟每次请求都有建连延迟频繁请求性能差首次有延迟后续请求零建连延迟响应更快故障感知每次新建连接天然感知服务端是否存活连接断了才发现需心跳检测离线