第一部分:网络基础概念
理解IP地址、端口和协议的基本概念及其在Java网络编程中的应用
学习目标
掌握IP地址分类、端口作用、常见网络协议以及InetAddress类的使用
IP地址
- IPv4地址:32位,点分十进制表示(如192.168.1.1)
- IPv6地址:128位,冒号分隔十六进制表示
- 特殊地址:127.0.0.1(本地回环地址)
- Java中的表示:
InetAddress
类
端口(Port)
- 范围:0-65535(16位无符号整数)
- 知名端口:0-1023(如HTTP:80, HTTPS:443)
- 注册端口:1024-49151
- 动态端口:49152-65535
网络协议
- TCP:面向连接、可靠传输
- UDP:无连接、不可靠但高效
- HTTP:应用层协议,基于TCP
- 其他:FTP、SMTP、DNS等
InetAddress类使用
Java中表示IP地址的核心类:
常见错误
- 未处理UnknownHostException异常
- 混淆getHostName()和getHostAddress()方法
- 在防火墙阻止的环境下无法解析外部主机
学习小贴士
使用InetAddress.getByName()
方法时,如果传入的是IP地址字符串(如"192.168.1.1"),不会进行DNS查询,直接返回对应的InetAddress对象;如果传入主机名,则会进行DNS查询。
第二部分:TCP通信
使用Socket和ServerSocket实现可靠的TCP网络通信
学习目标
掌握TCP服务器和客户端的创建、通信流程及异常处理
TCP服务器实现
使用ServerSocket创建TCP服务器:
TCP客户端实现
使用Socket连接TCP服务器:
TCP通信特点
- 面向连接(三次握手)
- 可靠传输(确认、重传机制)
- 有序的数据传输
- 流量控制和拥塞控制
- 适合需要可靠性的场景(文件传输、Web等)
常见错误
- 未关闭Socket导致资源泄漏
- 未处理SocketTimeoutException
- 未正确设置流编码导致乱码
- 在循环中未创建新Socket处理多个客户端
学习小贴士
使用setSoTimeout(int timeout)
方法可以设置Socket操作的超时时间(毫秒),避免网络问题导致的永久阻塞。
第三部分:UDP通信
使用DatagramSocket和DatagramPacket实现高效的UDP通信
学习目标
掌握UDP数据报的发送与接收,理解无连接通信的特点
UDP服务器实现
接收UDP数据报:
UDP客户端实现
发送UDP数据报:
UDP通信特点
- 无连接,无需建立连接
- 不可靠传输(可能丢失、乱序)
- 开销小,传输效率高
- 支持广播和多播
- 适合实时性要求高的场景(视频、游戏)
常见错误
- 未设置合理的DatagramPacket长度
- 未处理SocketTimeoutException
- 在接收数据后未正确截取有效数据长度
- 未考虑MTU限制导致数据包过大
学习小贴士
UDP数据包的最大理论长度是65535字节,但实际受网络MTU(通常1500字节)限制,建议将数据包控制在1472字节以内(1500-20IP头-8UDP头)。
第四部分:HTTP协议与URL类
理解HTTP协议基础,使用URL类处理HTTP请求
学习目标
掌握HTTP请求/响应结构,使用URLConnection发送HTTP请求
HTTP请求
- 请求方法:GET、POST、PUT、DELETE等
- 请求头:User-Agent、Content-Type等
- 请求体:POST/PUT请求携带的数据
HTTP响应
- 状态码:200 OK、404 Not Found等
- 响应头:Content-Type、Content-Length等
- 响应体:实际返回的数据
URL类
- 创建URL对象:new URL("https://example.com")
- 获取协议、主机、端口、路径等信息
- 打开连接:url.openConnection()
发送HTTP GET请求
使用HttpURLConnection发送GET请求:
常见错误
- 未处理MalformedURLException
- 未设置超时导致请求永久阻塞
- 未正确处理HTTP重定向(3xx状态码)
- 未设置User-Agent等必要请求头
学习小贴士
对于复杂的HTTP请求(如需要处理Cookie、重定向等),建议使用更高级的HTTP客户端库,如Apache HttpClient或OkHttp。
第五部分:NIO基础
使用Buffer和Channel实现非阻塞I/O操作
学习目标
掌握Buffer的核心概念和操作,使用Channel进行文件I/O
Buffer核心属性
- capacity:缓冲区容量(固定)
- position:当前位置(下一个读写位置)
- limit:可读写数据的上限
- mark:标记位置(用于reset)
Buffer操作流程
- 写入数据到Buffer(position移动)
- 调用flip()切换为读模式
- 从Buffer读取数据(position移动)
- 调用clear()或compact()清空缓冲区
Channel类型
- FileChannel:文件读写
- SocketChannel:TCP网络通信
- ServerSocketChannel:TCP服务器
- DatagramChannel:UDP网络通信
文件复制示例
使用FileChannel复制文件:
常见错误
- 忘记调用flip()切换Buffer模式
- 未正确处理Buffer的limit和position
- 在循环中未清除缓冲区导致无限循环
- 未关闭Channel导致资源泄漏
学习小贴士
使用FileChannel的transferTo()或transferFrom()方法可以实现高效的文件传输(零拷贝),特别适合大文件传输场景。
第六部分:多线程服务器开发
使用多线程技术实现高并发服务器
学习目标
掌握线程池管理客户端连接,实现高性能服务器
多线程TCP服务器
使用线程池处理客户端连接:
常见错误
- 线程池大小设置不合理(过小或过大)
- 未正确关闭客户端Socket
- 共享资源未同步导致线程安全问题
- 未处理线程中的异常
学习小贴士
对于高并发场景,考虑使用NIO(Selector)实现非阻塞I/O,结合线程池处理,可以大幅提升服务器的并发处理能力。
综合复习测试
检验你对Java网络基础知识的掌握程度
问题1:TCP和UDP的主要区别是什么?
正确答案:D
TCP是面向连接的可靠传输协议,保证数据顺序和完整性,但开销较大;UDP是无连接的不可靠协议,不保证数据送达,但传输效率高。
问题2:在Java中,哪个类用于表示IP地址?
正确答案:C
InetAddress类表示IP地址(包括IPv4和IPv6),提供了获取主机名、解析IP等方法。
问题3:使用ServerSocket创建TCP服务器时,哪个方法用于监听客户端连接?
正确答案:C
accept()方法监听客户端连接请求,并在连接建立后返回一个新的Socket对象用于与客户端通信。
问题4:在NIO中,Buffer的哪个方法用于切换为读模式?
正确答案:B
flip()方法将Buffer从写模式切换到读模式,将limit设置为当前位置,position设置为0。