Java SE-11Java加强-网络编程

📅 发布时间:2026/7/4 14:04:56 👁️ 浏览次数:
Java SE-11Java加强-网络编程
文章目录网络编程了解一、网络编程基础1. 网络编程的定义2. 两种核心通信架构1CS架构Client-客户端/Server-服务端2BS架构Browser-浏览器/Server-服务端3. Java网络编程的核心依赖二、网络通信三要素1. IP地址设备的唯一标识1Java中代表IP地址的类InetAddress2. 端口应用程序的唯一标识3. 协议通信的规则约定1传输层核心协议UDP与TCPUDP协议细节TCP协议细节三、UDP通信实现1. UDP通信核心类1DatagramSocket创建通信端点客户端/服务端2DatagramPacket封装数据包2. UDP通信基础流程一发一收1客户端发送端步骤2服务端接收端步骤3. UDP多发多收实现四、TCP通信实现1. TCP通信核心类1客户端Socket类2服务端ServerSocket类2. TCP通信基础流程一发一收1客户端步骤2服务端步骤3. TCP多发多收实现4. 服务端支持多客户端同时通信问题基础TCP服务端仅能处理一个客户端解决方案主线程子线程模式5. BS架构的底层原理TCPHTTP协议1核心流程2HTTP协议响应格式必须遵循3高并发优化线程池五、实战项目局域网聊天室1. 项目需求2. 前置技术储备3. 关键API补充1时间处理API2StringBuilder可变字符串3BigDecimal解决浮点运算失真六、核心小结网络编程了解一、网络编程基础1. 网络编程的定义网络编程是让设备中的程序与网络上其他设备中的程序进行数据交互的技术核心目的是实现跨设备的通信例如即时聊天、视频播放、网页访问等场景。2. 两种核心通信架构所有网络通信软件都基于以下两种架构之一实现且均依赖网络编程技术1CS架构Client-客户端/Server-服务端客户端Client需要程序员开发客户端软件用户需下载安装后才能使用如网易云音乐、微信APP服务端Server需要程序员开发服务端程序持续运行以接收客户端的连接和请求核心特点客户端与服务端直接通信针对性强功能丰富但需维护客户端安装和更新。2BS架构Browser-浏览器/Server-服务端浏览器Browser无需程序员开发用户通过已有的浏览器如Chrome、Edge访问服务端无需额外安装服务端Server需程序员开发服务端程序按HTTP协议返回数据核心特点无需开发客户端用户使用门槛低跨平台性强如京东网页、哔哩哔哩网页版。3. Java网络编程的核心依赖Java通过java.net.*包提供网络编程解决方案包含IP、端口、协议相关的类和接口支持UDP、TCP等通信方式。二、网络通信三要素网络通信必须具备三个核心要素缺一不可1. IP地址设备的唯一标识定义全称“互联网协议地址”Internet Protocol是分配给上网设备的唯一标识用于在网络中定位设备常见类型IPv432位地址采用点分十进制表示如192.168.1.66由4个字节组成地址资源有限IPv6128位地址采用冒分十六进制表示如2001:0db8:0000:0023:0008:0800:200c:417a地址资源极丰富号称能为地球上每一粒沙子编号相关概念域名Domain Name易记的人类可读名称如www.baidu.com、www.itheima.com需通过DNS解析为IP地址才能访问DNSDomain Name System域名解析系统充当互联网“电话簿”将域名映射为对应的IP地址公网IP vs 内网IP公网IP可直接连接互联网内网IP如192.168.开头仅用于组织机构内部网络无法直接被外网访问本机IP127.0.0.1或localhost代表当前程序所在的主机仅能访问本机服务常用命令ipconfig查看本机IP地址ping IP地址检查与目标设备的网络连通性。1Java中代表IP地址的类InetAddress核心方法方法说明public static InetAddress getLocalHost() throws UnknownHostException获取本机IP地址对象public String getHostName()获取IP对应的主机名public String getHostAddress()获取IP地址字符串如192.168.1.66public static InetAddress getByName(String host) throws UnknownHostException根据IP地址或域名获取InetAddress对象public boolean isReachable(int timeout) throws IOException判断在指定毫秒内是否能与该IP对应的主机连通2. 端口应用程序的唯一标识定义用于标记设备上正在运行的应用程序是16位二进制数范围为0~65535端口分类周知端口0~1023预留给知名应用如HTTP用80端口FTP用21端口不建议自定义程序使用注册端口1024~49151分配给用户进程或应用程序自定义程序推荐使用该范围动态端口49152~65535动态分配不固定绑定某一进程核心规则同一设备中两个应用程序的端口号不能重复否则会出现端口冲突错误。3. 协议通信的规则约定定义网络通信设备事先约定的连接规则和数据传输规则确保双方能正确解析数据两大网络模型OSI网络参考模型全球网络互联标准分为7层过于复杂TCP/IP网络模型事实上的国际标准简化为4层是实际开发的核心依据|OSI网络参考模型|TCP/IP网络模型|对应核心协议/操作|| ---- | ---- | ---- ||应用层|应用层|HTTP、FTP、SMTP等程序员主要在该层开发||表示层|/|/||会话层|/|/||传输层|传输层|UDP、TCP协议负责数据传输的可靠性控制||网络层|网络层|IP协议封装源和目标IP地址||数据链路层|数据链路层物理层|比特流传输依赖物理设备||物理层|/|/|1传输层核心协议UDP与TCP传输层有两个核心协议分别适用于不同场景协议类型UDP用户数据报协议TCP传输控制协议核心特点无连接、不可靠通信面向连接、可靠通信连接方式无需建立连接直接发送数据传输前需“三次握手”建立连接传输后需“四次挥手”断开连接数据限制单次传输数据最大64KB无数据大小限制可传输大量数据可靠性不保证数据送达可能丢失、乱序通过确认机制保证数据可靠传输不丢失、不重复、有序通信效率高无连接开销较低连接和确认开销适用场景视频直播、语音通话、实时游戏网页访问、文件下载、支付、邮件发送UDP协议细节发送端将数据、接收端IP、端口封装成“数据包”发送后不关心对方是否接收接收端仅接收数据包不区分发送端可同时接收多个发送端的消息。TCP协议细节三次握手建立连接确保通信双方收发能力正常全双工通信类似“你瞅啥→ 瞅你咋地→ 走咱俩唠唠”的确认过程客户端发出连接请求服务端返回响应确认收到请求客户端再次发送确认信息连接正式建立四次挥手断开连接确保双方已完成所有数据收发类似“我要走啦→ 好的稍等→ 处理完毕确认断开→ 溜啦”的过程客户端发出断开连接请求服务端返回响应告知“稍等正在处理剩余数据”服务端处理完数据后发送确认断开信息客户端返回最终响应连接断开。三、UDP通信实现1. UDP通信核心类Java通过DatagramSocket通信端点和DatagramPacket数据包实现UDP通信1DatagramSocket创建通信端点客户端/服务端构造器说明public DatagramSocket()创建客户端Socket对象系统随机分配端口号public DatagramSocket(int port)创建服务端Socket对象指定固定端口号需与客户端目标端口一致方法说明public void send(DatagramPacket dp)发送数据包public void receive(DatagramPacket p)接收数据包阻塞方法直到收到数据2DatagramPacket封装数据包构造器说明public DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建发送用的数据包指定数据、接收端IP和端口public DatagramPacket(byte[] buf, int length)创建接收用的数据包指定存储数据的字节数组和长度方法说明public int getLength()获取数据包中实际接收的字节数2. UDP通信基础流程一发一收1客户端发送端步骤创建DatagramSocket对象客户端通信端点准备发送的数据封装成DatagramPacket对象指定接收端IP和端口调用DatagramSocket的send()方法发送数据包释放资源关闭DatagramSocket。2服务端接收端步骤创建DatagramSocket对象指定固定端口号创建DatagramPacket对象用于存储接收的数据调用DatagramSocket的receive()方法接收数据阻塞释放资源。3. UDP多发多收实现客户端通过while死循环持续接收用户输入输入“exit”则退出否则封装数据并发送服务端通过while死循环持续调用receive()方法接收数据实现反复接收核心特点服务端不区分发送端可同时接收多个客户端的消息。四、TCP通信实现1. TCP通信核心类TCP通信分为客户端和服务端核心类为Socket客户端和ServerSocket服务端1客户端Socket类构造器说明public Socket(String host, int port)根据服务端IP或域名和端口请求与服务端建立连接连接成功后返回Socket对象方法说明public OutputStream getOutputStream()获取字节输出流用于向服务端发送数据public InputStream getInputStream()获取字节输入流用于接收服务端返回的数据public void close()关闭Socket管道释放资源2服务端ServerSocket类构造器说明public ServerSocket(int port)注册服务端端口用于接收客户端连接方法说明public Socket accept()阻塞等待客户端连接连接成功后返回与该客户端对应的Socket对象public void close()关闭服务端释放资源2. TCP通信基础流程一发一收1客户端步骤创建Socket对象指定服务端IP和端口发起连接通过Socket的getOutputStream()获取字节输出流发送数据可选通过getInputStream()获取字节输入流接收服务端响应关闭Socket释放资源。2服务端步骤创建ServerSocket对象注册服务端端口调用accept()方法阻塞等待客户端连接获取对应的Socket对象通过Socket的getInputStream()获取字节输入流接收客户端数据可选通过getOutputStream()获取字节输出流向客户端发送响应关闭Socket和ServerSocket释放资源。3. TCP多发多收实现客户端通过while死循环持续接收用户输入并发送数据直到输入指定退出指令服务端通过while死循环持续调用accept()接收客户端连接并用独立逻辑接收该客户端的多次数据核心特点需保证客户端和服务端的读写逻辑对应如客户端发一次服务端收一次。4. 服务端支持多客户端同时通信问题基础TCP服务端仅能处理一个客户端基础服务端是单线程的调用accept()接收一个客户端后会专注处理该客户端的通信无法响应其他客户端的连接请求。解决方案主线程子线程模式主线程循环调用accept()负责接收所有客户端的连接请求子线程每接收一个客户端的Socket对象就创建一个独立子线程由子线程负责与该客户端的通信读写数据核心逻辑主线程只管“接连接”子线程管“处理通信”实现多客户端同时交互。5. BS架构的底层原理TCPHTTP协议BS架构本质是特殊的TCP通信客户端为浏览器服务端需遵循HTTP协议返回数据1核心流程浏览器客户端通过http://服务端IP:端口发起TCP连接服务端接收连接后按HTTP协议格式返回数据浏览器解析HTTP响应数据展示为网页。2HTTP协议响应格式必须遵循响应数据需严格按以下格式组织否则浏览器无法识别格式说明示例协议版本 状态码 状态符\r\nHTTP/1.1 200 OK\r\n头部字段名: 值\r\n可多个Content-Type:text/html; charsetUTF-8\r\n单独空行\r\n无内容仅换行响应正文网页数据听黑马磊哥讲Java3高并发优化线程池问题每次接收浏览器请求都创建新线程高并发时会导致线程过多系统崩溃优化方案使用线程池管理线程核心线程复用避免频繁创建/销毁线程的开销流程主线程接收浏览器连接后将通信任务提交到线程池由核心线程处理。五、实战项目局域网聊天室1. 项目需求开发局域网内的即时沟通软件支持多个用户通过昵称登录实时发送和接收消息消息包含发送者、发送时间和内容。2. 前置技术储备GUI界面编程用于实现聊天室的登录界面、聊天窗口网络通信基于TCP/UDP协议实现消息的发送和接收面向对象编程封装用户、消息等实体类常用API时间处理LocalDate、LocalTime、LocalDateTime获取和格式化发送时间字符串高效操作StringBuilder拼接消息内容效率高于String浮点运算可选BigDecimal解决浮点型运算失真问题如金额计算。3. 关键API补充1时间处理API类说明核心方法LocalDate代表本地日期年、月、日now()获取当前日期getYear()/getMonthValue()等获取日期字段LocalTime代表本地时间时、分、秒now()获取当前时间getHour()/getMinute()等获取时间字段LocalDateTime代表日期时间now()获取当前日期时间plusXXX()/minusXXX()增减时间字段2StringBuilder可变字符串构造器说明public StringBuilder()创建空白可变字符串对象public StringBuilder(String str)创建包含指定字符串的可变对象方法说明public StringBuilder append(任意类型)添加数据返回自身支持链式调用public StringBuilder reverse()反转字符串内容public int length()获取字符串长度public String toString()转换为String类型3BigDecimal解决浮点运算失真构造器/静态方法说明public static BigDecimal valueOf(double val)将double转换为BigDecimal推荐使用public BigDecimal(String val)将字符串转换为BigDecimalpublic BigDecimal(double val)不推荐可能导致失真核心方法说明add(BigDecimal b)加法运算subtract(BigDecimal b)减法运算multiply(BigDecimal b)乘法运算divide(BigDecimal b)除法运算divide(BigDecimal b, int scale, RoundingMode mode)除法运算指定保留小数位数和舍入模式doubleValue()转换为double类型六、核心小结网络通信三要素IP设备标识、端口应用标识、协议通信规则缺一不可UDP vs TCPUDP无连接、高效但不可靠适用于实时场景TCP面向连接、可靠但效率低适用于需要保证数据完整性的场景UDP通信核心DatagramSocket端点DatagramPacket数据包服务端可同时接收多个客户端消息TCP通信核心客户端Socket 服务端ServerSocket多客户端通信需用“主线程接连接子线程处理通信”BS架构本质TCP通信HTTP协议服务端需按指定格式返回数据高并发场景需用线程池优化实战关键结合GUI、网络通信、API工具类封装实体和业务逻辑实现功能完整的通信软件。