当前位置: 首页 > article >正文

孤舟笔记 IO 与网络编程篇五 网络编程你真的懂吗?从Socket到TCP连接全解析

文章目录一、先说结论网络编程核心事实二、TCP 编程三次握手的 Socket 视角三、UDP 编程无连接的数据报四、服务端线程模型演进模型一一连接一线程最原始模型二线程池改进模型三NIO Selector最优五、TCP 连接的状态流转六、Socket 常用参数网络编程 全景回答技巧与点评标准回答加分回答面试官点评个人网站面试官问说说你对网络编程的理解很多人只能说出Socket 编程但追问TCP 和 UDP 的 Socket 有什么区别、“服务端怎么处理多连接”、“TIME_WAIT 是什么”就答不全了。网络编程是后端开发的基础功理解 Socket 才能理解上层框架。今天咱们把 Java 网络编程的核心知识讲透。一、先说结论网络编程核心事实维度说明核心 APIServerSocket SocketTCPDatagramSocketUDPTCP Socket面向连接可靠传输字节流UDP Socket无连接不可靠数据报线程模型一连接一线程 → 线程池 → NIO Selector关键状态TIME_WAIT、CLOSE_WAIT、ESTABLISHED一句话记住TCP Socket 像打电话先拨号再通话UDP Socket 像发短信直接发不管对方在不在。二、TCP 编程三次握手的 Socket 视角服务端ServerSocketservernewServerSocket(8080);// 1. 绑定端口Socketclientserver.accept();// 2. 等待连接三次握手InputStreaminclient.getInputStream();// 3. 获取输入流OutputStreamoutclient.getOutputStream();// 4. 获取输出流客户端SocketsocketnewSocket(127.0.0.1,8080);// 1. 发起连接三次握手OutputStreamoutsocket.getOutputStream();// 2. 获取输出流InputStreaminsocket.getInputStream();// 3. 获取输入流Socket 与三次握手的对应客户端 服务端 | | |──── SYN ────────────────────→| server.accept() 等待 | | |←─── SYNACK ────────────────| 三次握手建立连接 | | |──── ACK ────────────────────→| accept() 返回 Socket | | |──── 数据 ──────────────────→| 读写数据 |←─── 数据 ───────────────────|accept() 返回的 Socket 和客户端的 Socket 是一对——它们代表同一个 TCP 连接的两端。三、UDP 编程无连接的数据报// 服务端DatagramSocketservernewDatagramSocket(9090);byte[]bufnewbyte[1024];DatagramPacketpacketnewDatagramPacket(buf,buf.length);server.receive(packet);// 接收数据报 // 客户端DatagramSocketclientnewDatagramSocket();byte[]datahello.getBytes();InetAddressaddrInetAddress.getByName(127.0.0.1);DatagramPacketpacketnewDatagramPacket(data,data.length,addr,9090);client.send(packet);// 发送数据报 TCP vs UDP 对比维度TCPUDP连接面向连接三次握手无连接可靠性可靠确认重传不可靠传输方式字节流数据报顺序保证有序不保证速度较慢较快适用场景文件传输、HTTP视频直播、DNS四、服务端线程模型演进模型一一连接一线程最原始while(true){Socketclientserver.accept();newThread(()-handle(client)).start();// 每个连接一个线程 }// 问题1000 连接 1000 线程OOM模型二线程池改进ExecutorServicepoolExecutors.newFixedThreadPool(200);while(true){Socketclientserver.accept();pool.submit(()-handle(client));// 线程池复用 }// 改进限制了线程数量// 问题200 个线程都在阻塞等待浪费资源模型三NIO Selector最优SelectorselectorSelector.open();ServerSocketChannelsscServerSocketChannel.open();ssc.configureBlocking(false);ssc.register(selector,SelectionKey.OP_ACCEPT);while(true){selector.select();// 等待事件 for(SelectionKeykey:selector.selectedKeys()){if(key.isAcceptable()){// 接受新连接}elseif(key.isReadable()){// 读取数据}}}// 1~4 个线程处理成千上万个连接五、TCP 连接的状态流转TCP 连接从建立到关闭的完整状态客户端 服务端 CLOSED CLOSED | | | SYN_SENT ──── SYN ────→ LISTEN | | | | ESTABLISHED ← SYNACK ─ SYN_RCVD | | | | ──── ACK ────→ ESTABLISHED | | | | ──── FIN ────→ CLOSE_WAIT | | FIN_WAIT_1 | | | | FIN_WAIT_2 ←──── ACK ──── | | | | TIME_WAIT ←──── FIN ──── LAST_ACK | | | | ──── ACK ────→ CLOSED | | TIME_WAIT等 2MSL | | CLOSED |两个关键状态状态出现在原因解决TIME_WAIT主动关闭方等待 2MSL 确保对方收到最后的 ACKSO_REUSEADDRCLOSE_WAIT被动关闭方应用层没有调用 close()检查代码是否关闭 Socket大量 TIME_WAIT主动关闭连接的一方会进入 TIME_WAIT等待 2MSL约 60 秒。高并发短连接场景下可能导致端口耗尽。大量 CLOSE_WAIT说明应用层 Bug——对方关闭了连接但你没有调用 close()。六、Socket 常用参数// 地址复用——TIME_WAIT 状态下也能绑定同一端口server.setReuseAddress(true);// 解决 TIME_WAIT 端口占用// 关闭 Nagle 算法——小数据立即发送socket.setTcpNoDelay(true);// 适合实时性要求高的场景// Keep-Alive——检测死连接socket.setKeepAlive(true);// 超时设置socket.setSoTimeout(5000);// 读超时 5 秒server.setSoTimeout(3000);// accept 超时 3 秒// 发送/接收缓冲区大小socket.setSendBufferSize(64*1024);socket.setReceiveBufferSize(64*1024);网络编程 全景网络编程 全景 核心 API ├── TCP ── ServerSocket Socket ├── UDP ── DatagramSocket DatagramPacket └── NIO ── ServerSocketChannel SocketChannel Selector TCP vs UDP ├── TCP ── 可靠、有序、字节流、有连接 └── UDP ── 不可靠、无序、数据报、无连接 线程模型演进 ├── 一连接一线程 ── OOM ├── 线程池 ── 限制线程数但浪费资源 └── NIO Selector ── 一线程多连接 TCP 关键状态 ├── TIME_WAIT ── 主动关闭方等 2MSL ├── CLOSE_WAIT ── 被动关闭方未 close └── ESTABLISHED ── 连接建立 常用参数 ├── SO_REUSEADDR ── 地址复用 ├── TCP_NODELAY ── 关闭 Nagle ├── SO_KEEPALIVE ── 保活探测 └── SO_TIMEOUT ── 超时设置 口诀TCP 可靠三次握UDP 无连接快但丢 线程模型三级跳NIO Selector 是最优 TIME_WAIT 主动等CLOSE_WAIT 忘了关 参数设置要合理网络编程才稳定。回答技巧与点评标准回答Java 网络编程基于 Socket API。TCP 编程使用 ServerSocket 监听 Socket 通信面向连接、可靠传输UDP 编程使用 DatagramSocket 发送/接收数据报无连接、不可靠但快速。服务端线程模型经历了从一连接一线程到线程池再到 NIO Selector 的演进NIO 通过多路复用实现一线程处理多连接是高并发场景的最优方案。TCP 连接关闭时主动关闭方进入 TIME_WAIT等 2MSL被动关闭方如果没调用 close() 会停留在 CLOSE_WAIT。加分回答Netty 的线程模型Netty 采用主从 Reactor 多线程模型——boss group主 Reactor负责 accept 连接worker group从 Reactor负责 IO 读写。每个 EventLoop 是一个 Reactor内部是一个 Selector 一个任务队列。这种模型比直接用 NIO 编程简单得多性能也更好半包和粘包问题TCP 是字节流协议不保证消息边界——发送hello和world可能被接收为helloworld粘包或hel“loworld”半包。解决方案固定长度、分隔符、长度字段最常用。Netty 提供了 LengthFieldBasedFrameDecoder 开箱即用WebSocket 和 HTTP/2传统 HTTP 是短连接请求-响应模式WebSocket 在 TCP 上实现全双工通信HTTP/2 在 TCP 上实现多路复用。它们都是基于 TCP Socket 的应用层协议但通过不同的帧格式实现了更高效的通信面试官点评这道题考的是你对网络编程基础的理解。能说出ServerSocket/Socket、TCP vs UDP、线程模型演进是基本要求能讲清楚 TIME_WAIT 和 CLOSE_WAIT 的区别、NIO 的优势、常用 Socket 参数才算及格。如果你能提到 Netty 的线程模型、半包粘包问题、WebSocket/HTTP2面试官会认为你对网络编程的理解不只在 Socket API 层面还延伸到了协议和框架层面。原文阅读内容有帮助点赞、收藏、关注三连评论区等你

相关文章:

孤舟笔记 IO 与网络编程篇五 网络编程你真的懂吗?从Socket到TCP连接全解析

文章目录一、先说结论:网络编程核心事实二、TCP 编程:三次握手的 Socket 视角三、UDP 编程:无连接的数据报四、服务端线程模型演进模型一:一连接一线程(最原始)模型二:线程池(改进&a…...

20 - 告别“无限上下文”的幻觉:大模型知识注入的“四层矩阵”与下一场权重战争

本专题系列文章共 21 篇,前 5 篇限时免费阅读 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线” 03 - 从电力到AI:标准化已死,个性化永生——大模型时代的三大商业终局 04 - 你的护城…...

19 - 语言模型为何是AGI的开端?——从“知识压缩”到“智能涌现”的第一性原理

本专题系列文章共 21 篇,前 5 篇限时免费阅读 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线” 03 - 从电力到AI:标准化已死,个性化永生——大模型时代的三大商业终局 04 - 你的护城…...

告别网络盲区:用RTL8811CU让旧笔记本变身Linux双频WiFi网卡/AP二合一网关

旧硬件新生:用RTL8811CU打造Linux双频无线网关实战指南 每次升级笔记本后,那些陪伴我们多年的旧设备往往被束之高阁。作为一名网络技术爱好者,我发现这些"退役"笔记本其实蕴藏着巨大的再利用价值——特别是当它们遇到RTL8811CU这样…...

【可口可乐全球设计中心认证流程】:从Prompt工程到DPI输出的12小时高保真印相交付链

更多请点击: https://intelliparadigm.com 第一章:【可口可乐全球设计中心认证流程】:从Prompt工程到DPI输出的12小时高保真印相交付链 可口可乐全球设计中心(Coca-Cola Global Design Hub)采用端到端AI增强型印前认证…...

YOLO26缝合SA(Spatial Attention):纯空间维度的特征图清洗与提炼

前沿洞察:2026年初,Ultralytics创始人Glenn Jocher在YOLO Vision 2025大会上正式发布YOLO26,定义为“生产级视觉AI的结构性飞跃”。与此同时,空间注意力(Spatial Attention, SA)作为一种“即插即用”的特征提纯手段,正以极低的计算代价重构YOLO的Neck与Head。当YOLO26遇…...

使用DSP280049的CLB做LLC硬件同步整流

一、根据epwm1a配置1pwm2a。一)搭建自己的第一部分clb结构如下:1.配置输入配置clb输入,配置输入选择epwm1a的zero与compA。input0是上升沿,input1是下降沿。2.配置计数器配置计数器,计数器重新计数配置成pwm1a上升沿。…...

2024 Q2全球AI搜索基准测试TOP3结果泄露:Perplexity在长尾专业查询中胜率68.4%,但ChatGPT在模糊意图理解上反超——你的团队该押注哪条技术路径?

更多请点击: https://intelliparadigm.com 第一章:2024 Q2全球AI搜索基准测试TOP3结果深度解读 本季度由MLPerf与AI Index联合发布的AI搜索基准测试(SearchBench v2.1)覆盖了17个主流模型,在真实网页索引、多跳推理、…...

FPGA与CPU电源时序测试技术解析与实践

1. FPGA与CPU电源时序测试的核心挑战在现代电子系统中,FPGA、MCU和CPU等处理器件的电源设计堪称"心脏手术"。我曾参与过多个Xilinx UltraScale和Intel Stratix 10项目的电源验证,深刻体会到毫秒级的时序偏差就可能导致数千美元的芯片瞬间损毁。…...

高速PCB设计实战:五种端接方案如何选型与优化

1. 高速PCB设计中的信号完整性问题 在高速PCB设计中,信号完整性(SI)问题就像城市交通拥堵一样常见。想象一下,当信号以GHz级别的频率在电路板上传输时,就像高峰期的高速公路上飞驰的跑车,任何一个小小的阻抗…...

【LangChain】 输出解析器(Output Parsers)完全指南

LangChain 输出解析器(Output Parsers)完全指南2026 年最新版 | 覆盖所有内置解析器 完整代码示例一、什么是输出解析器 输出解析器是 LangChain 中连接"自由文本 LLM"与"结构化程序"的桥梁。LLM 天生输出自然语言,但应…...

AI设计风格Prompt实战指南:从32种风格词典到精准生成

1. 项目概述:一份给AI设计师的“风格词典”如果你和我一样,经常用 Claude、Cursor 或者 v0 这类 AI 工具来生成网页界面,那你肯定遇到过这个头疼的问题:脑子里想的是“赛博朋克”或者“瑞士风格”,但打出来的 prompt 却…...

AI Agent思维文件版本控制:mindkeeper工具的设计原理与实战指南

1. 项目概述:为AI的“大脑”打造时光机如果你正在使用像OpenClaw这样的AI助手框架,或者任何基于Markdown文件来定义AI行为、记忆和技能的项目,那么你一定经历过这样的时刻:为了优化AI的回复风格,你反复调整了SOUL.md里…...

避坑指南:Arduino驱动四位七段数码管时,SevSeg库配置与硬件接线的那些细节

Arduino四位七段数码管避坑实战:从乱码到稳定显示的进阶指南 当你兴奋地按照教程连接好Arduino和四位七段数码管,上传代码后却发现显示乱码、部分段不亮或者亮度不均——这可能是每个创客都会经历的"成人礼"。本文将带你深入SevSeg库的配置细节…...

SAR ADC性能优化:电压基准设计与THD改善方案

1. 电压基准对SAR ADC性能的影响机制在精密数据采集系统设计中,工程师们常常花费大量精力选择高性能的模数转换器(ADC)和优化输入驱动电路,却容易忽视一个关键因素——电压基准的质量及其驱动能力。对于逐次逼近型(SAR)ADC而言,基准电压的稳定…...

ARM嵌入式开发:硬件抽象层与调试监控技术解析

1. ARM嵌入式开发中的硬件抽象层与调试监控在ARM嵌入式系统开发中,硬件抽象层(HAL)和调试监控器是两大核心基础设施。它们如同汽车的底盘和仪表盘——HAL负责统一管理发动机、变速箱等硬件组件,而调试监控器则提供实时运行数据与交…...

C语言核心知识体系总结

C语言核心知识体系总结本文旨在系统梳理C语言的基础与进阶知识点,帮助读者建立清晰的知识框架。内容涵盖:程序编译过程、数据类型与变量、运算符与表达式、控制结构、函数、指针、结构体与共用体、动态内存分配、文件操作等。适合复习巩固或查漏补缺。第…...

基于MCP的AI智能体:用自然语言轻松管理TikTok广告投放

1. 项目概述:用AI智能体玩转TikTok广告投放 如果你正在做跨境电商、品牌出海,或者任何面向年轻消费者的生意,TikTok广告绝对是你绕不开的战场。但真正上手后,你会发现事情没那么简单:TikTok的广告后台(Ads…...

基于RAG的本地知识库聊天机器人:anything-llm部署与实战指南

1. 项目概述:一个能“消化”任何文件的本地知识库聊天机器人最近在折腾本地大模型应用的朋友,可能都绕不开一个痛点:如何让大模型“读懂”并“记住”我自己的文档?无论是PDF报告、Word文档、网页文章,还是代码片段&…...

阿里:时序课程解决多轮蒸馏不稳定

📖标题:TCOD: Exploring Temporal Curriculum in On-Policy Distillation for Multi-turn Autonomous Agents 🌐来源:arXiv, 2604.24005v3 🛎️文章简介 🔸研究问题:如何在多轮自主智能体场景中…...

会话搜索服务器实战:从架构设计到生产部署的完整指南

1. 项目概述与核心价值最近在折腾一个挺有意思的玩意儿,叫session_search_server。这名字乍一看有点抽象,但如果你做过聊天机器人、客服系统,或者任何需要处理多轮对话、历史记录查询的应用,那你肯定遇到过类似的痛点:…...

为AI智能体构建长期记忆系统:零配置集成与四通道混合检索实践

1. 项目概述:为AI智能体装上“长期记忆”在AI智能体(Agent)的开发与使用中,一个长期存在的痛点就是“健忘症”。无论是基于OpenAI API还是本地部署的大模型,标准的对话模式都是无状态的——每次交互对于模型来说都是一…...

AI Agent Harness Engineering 未来生态:开源 vs 闭源的竞争与合作格局

AI Agent Harness Engineering 未来生态:开源 vs 闭源的竞争与合作格局 引言:AI Agent不是终点,Harness才是通用智能落地的核心阀门 1.1 从“AI大模型(LLM)元年”到“AI Agent生态元年”:技术拐点的悄然发…...

C++ 入门核心语法|从 Hello World 到基础特性一次性吃透

文章目录前言一、C 第一个程序:Hello World二、命名空间 namespace1. 为什么需要命名空间?2. 命名空间定义规则3. 三种使用方式三、C 输入 & 输出1. 核心对象2. 最大优势四、缺省参数(默认参数)1. 定义2. 使用方式3. 声明与定…...

半导体技术评估:如何判断新技术从概念到产品的“露点”

1. 开篇:从“露点”看半导体行业的虚实迷雾 大家好,我是Don Scansen。在半导体行业摸爬滚打了二十多年,从设计、验证到失效分析,几乎把产业链的各个环节都趟了一遍。今天,我想借这个新开的专栏,和大家聊聊一…...

德国工业4.0工程师指南:从系统融合到职业发展

1. 项目概述:为什么德国是工业工程师的理想目的地?如果你是一名工业、自动化或机器人领域的工程师,正在寻找一个能将你的技术抱负与前沿产业实践深度结合的职业舞台,那么德国很可能就是你一直在寻找的答案。这不仅仅是因为德国拥有…...

商业航天崛起:从SpaceX看工程创新与政策博弈的融合

1. 商业航天崛起的时代背景与技术逻辑2012年5月,当SpaceX的“龙”飞船与国际空间站成功对接时,我正和几位航天领域的同行在会议室里盯着直播画面。那一刻的安静与随后爆发的掌声,不仅仅是为一次技术成功,更是为一个新时代的开启感…...

从纸质手册到智能助手:技术会议应用如何重塑信息获取与时间管理

1. 从混乱到有序:技术会议体验的痛点与变革契机如果你参加过像国际电子器件会议(IEDM)或国际固态电路会议(ISSCC)这样的大型学术盛会,你肯定对那种“甜蜜的烦恼”深有体会。面对五六个并行进行的专题分会场…...

为什么你的Perplexity Science搜索总错过最新预印本?——基于arXiv/medRxiv/SSRN实时源的3层校验机制(含Python自动化脚本)

更多请点击: https://intelliparadigm.com 第一章:为什么你的Perplexity Science搜索总错过最新预印本?——基于arXiv/medRxiv/SSRN实时源的3层校验机制(含Python自动化脚本) Perplexity Science 依赖第三方索引快照…...

LocalChat:零门槛本地部署开源大语言模型,实现隐私安全的离线AI对话

1. 项目概述与核心价值如果你和我一样,对ChatGPT这类大语言模型的能力感到兴奋,但又对数据隐私、服务依赖和网络延迟心存顾虑,那么LocalChat这个项目可能就是为你量身打造的。简单来说,LocalChat是一个让你能在自己电脑上&#xf…...