Java 网络编程
一、 网络基础概念
1.1 网络通信
-
概念:两台设备之间通过网络实现数据传输。
-
Java支持:java.net 包提供了一系列类/接口用于网络通信。
1.2 网络分类
-
局域网 (LAN):覆盖范围最小,如一个教室、机房。
-
城域网 (MAN):覆盖一个城市。
-
广域网 (WAN):覆盖全国或全球,如互联网。
1.3 IP地址
-
作用:唯一标识网络中的每台计算机/主机。
-
表示形式:点分十进制 xx.xx.xx.xx(每个数范围0~255)。
-
组成:网络地址 + 主机地址。
-
IPv4 vs IPv6:IPv4地址资源有限,IPv6地址数量极大,是下一代协议。
-
IPv4地址分类:
| 类型 | 范围 |
|---|---|
| A类 | 0.0.0.0 到 127.255.255.255 |
| B类 | 128.0.0.0 到 191.255.255.255 |
| C类 | 192.0.0.0 到 223.255.255.255 |
| D类 | 224.0.0.0 到 239.255.255.255 (多播) |
| E类 | 240.0.0.0 到 247.255.255.255 (保留) |
1.4 域名与端口
-
端口:
-
作用:标识计算机上某个特定的网络程序。
-
范围:0 ~ 65535。
-
约定:0~1024已被系统或知名服务占用(如HTTP:80, FTP:21, SSH:22)。
-
常见程序端口:Tomcat:8080, MySQL:3306, Oracle:1521。
-
1.5 网络通信协议
-
TCP/IP协议簇:Internet最基本的协议,由网络层的IP协议和传输层的TCP协议等组成。
-
网络模型:
| OSI模型 | TCP/IP模型 | TCP/IP模型各层协议 |
| 应用层 | 应用层 | HTTP, FTP, Telnet, DNS… |
| 表示层 | 应用层 | |
| 会话层 | 应用层 | |
| 传输层 | 传输层 | TCP, UDP… |
| 网络层 | 网络层 | IP, ICMP, ARP… |
| 数据链路层 | 物理+数据链路层 | Link |
| 物理层 | 物理+数据链路层 | Link |
1.6 TCP 与 UDP 协议
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
| 连接性 | 面向连接 (三次握手) | 无连接 |
| 可靠性 | 可靠,数据不丢失 | 不可靠,可能丢包 |
| 通信单位 | 字节流 | 数据报 (包) |
| 数据大小 | 无限制 | 每个数据报 ≤ 64K |
| 效率 | 较低 (需建立/释放连接) | 较高 |
| 应用场景 | 文件传输、邮件、网页浏览 | 音视频通话、直播、DNS查询 |
二、 InetAddress 类
-
作用:用于封装IP地址和域名。
-
常用方法:
-
InetAddress.getLocalHost():获取本机InetAddress对象。
-
InetAddress.getByName(String host):根据主机名/域名获取对象。
-
getHostName():获取主机名。
-
getHostAddress():获取IP地址字符串。
-
三、 Socket 编程
3.1 Socket 概念
-
套接字(Socket)是网络通信的端点。
-
通信两端都必须有Socket。
-
数据在Socket间通过IO流传输。
-
主动发起连接的是客户端,等待连接的是服务端。
四、 TCP 网络编程
4.1 编程模型
-
服务端:
-
创建 ServerSocket,在指定端口监听。
-
调用 accept() 等待客户端连接,连接成功返回 Socket 对象。
-
通过 Socket.getInputStream() 读取客户端发送的数据。
-
通过 Socket.getOutputStream() 向客户端回复数据。
-
关闭资源。
-
-
客户端:
-
创建 Socket,连接服务端(指定IP和端口)。
-
通过 Socket.getOutputStream() 发送数据。
-
通过 Socket.getInputStream() 接收服务端回复。
-
关闭资源。
-
4.2 应用案例
-
案例1 (字节流,单向):客户端发送“hello, server”后退出,服务端接收并打印。
-
案例2 (字节流,双向):客户端发送消息,服务端回复“hello, client”,客户端接收回复。
- 注意:通信结束时,应调用 socket.shutdownOutput() 设置输出结束标记,告知对方数据已发送完毕,避免对方 read 方法阻塞。
-
案例3 (字符流,双向):使用 BufferedReader 和 BufferedWriter 包装流进行字符通信。
- 注意:使用 bufferedWriter.newLine() 插入换行作为结束标记,并调用 flush() 手动刷新缓冲区。
-
案例4 (文件上传):客户端发送图片/文件,服务端保存到本地,并回复“收到图片”。
-
核心:使用 BufferedInputStream 和 BufferedOutputStream 提高效率。
-
工具类:使用 StreamUtils 将输入流转换为字节数组或字符串,简化操作。
-
4.3 注意事项
-
实际通信中,客户端也会使用一个随机端口与服务端通信。
-
可使用 netstat -an 指令查看主机网络状态(监听端口和连接信息)。
五、 UDP 网络编程
5.1 基本介绍
-
核心类:DatagramSocket (数据报套接字) 和 DatagramPacket (数据包/数据报)。
-
无连接:每个数据包独立,包含发送方和接收方的IP与端口。
-
不可靠:不保证送达和顺序。
5.2 编程模型
-
发送端:
-
创建 DatagramSocket 对象。
-
将数据封装到 DatagramPacket 对象中(指定数据、长度、目标IP、端口)。
-
调用 socket.send(packet) 发送。
-
可接收回复。
-
关闭 socket。
-
-
接收端:
-
创建 DatagramSocket 并在指定端口监听。
-
创建空的 DatagramPacket 对象用于接收。
-
调用 socket.receive(packet) 阻塞等待数据。
-
拆包 (packet.getData()) 处理数据。
-
可回复数据。
-
关闭 socket。
-
5.3 应用案例
- 接收端A在9999端口等待,发送端B发送“hello, 明天吃火锅~”,A接收后回复“好的,明天见”。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!