国庆节10月1日
--


嘿,想用 Java 写个聊天程序、上传文件,或者搞懂为啥浏览器输个网址就能打开网页?其实没那么玄——底层就是 IP、端口、TCP/UDP 这些“老朋友”在干活。这篇就带你轻轻松松理清网络编程的脉络,不堆概念,不啃协议,只聊代码里真正用得到的那些事儿。
概念:两台设备之间通过网络实现数据传输。
Java支持:java.net 包提供了一系列类/接口用于网络通信。
局域网 (LAN):覆盖范围最小,如一个教室、机房。
城域网 (MAN):覆盖一个城市。
广域网 (WAN):覆盖全国或全球,如互联网。
作用:唯一标识网络中的每台计算机/主机。
表示形式:点分十进制 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 (保留) |
端口:
作用:标识计算机上某个特定的网络程序。
范围:0 ~ 65535。
约定:0~1024已被系统或知名服务占用(如HTTP:80, FTP:21, SSH:22)。
常见程序端口:Tomcat:8080, MySQL:3306, Oracle:1521。
TCP/IP协议簇:Internet最基本的协议,由网络层的IP协议和传输层的TCP协议等组成。
网络模型:
| OSI模型 | TCP/IP模型 | TCP/IP模型各层协议 |
| 应用层 | 应用层 | HTTP, FTP, Telnet, DNS… |
| 表示层 | 应用层 | |
| 会话层 | 应用层 | |
| 传输层 | 传输层 | TCP, UDP… |
| 网络层 | 网络层 | IP, ICMP, ARP… |
| 数据链路层 | 物理+数据链路层 | Link |
| 物理层 | 物理+数据链路层 | Link |
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
| 连接性 | 面向连接 (三次握手) | 无连接 |
| 可靠性 | 可靠,数据不丢失 | 不可靠,可能丢包 |
| 通信单位 | 字节流 | 数据报 (包) |
| 数据大小 | 无限制 | 每个数据报 ≤ 64K |
| 效率 | 较低 (需建立/释放连接) | 较高 |
| 应用场景 | 文件传输、邮件、网页浏览 | 音视频通话、直播、DNS查询 |
作用:用于封装IP地址和域名。
常用方法:
InetAddress.getLocalHost():获取本机InetAddress对象。
InetAddress.getByName(String host):根据主机名/域名获取对象。
getHostName():获取主机名。
getHostAddress():获取IP地址字符串。
套接字(Socket)是网络通信的端点。
通信两端都必须有Socket。
数据在Socket间通过IO流传输。
主动发起连接的是客户端,等待连接的是服务端。
服务端:
创建 ServerSocket,在指定端口监听。
调用 accept() 等待客户端连接,连接成功返回 Socket 对象。
通过 Socket.getInputStream() 读取客户端发送的数据。
通过 Socket.getOutputStream() 向客户端回复数据。
关闭资源。
客户端:
创建 Socket,连接服务端(指定IP和端口)。
通过 Socket.getOutputStream() 发送数据。
通过 Socket.getInputStream() 接收服务端回复。
关闭资源。
案例1 (字节流,单向):客户端发送“hello, server”后退出,服务端接收并打印。
案例2 (字节流,双向):客户端发送消息,服务端回复“hello, client”,客户端接收回复。
案例3 (字符流,双向):使用 BufferedReader 和 BufferedWriter 包装流进行字符通信。
案例4 (文件上传):客户端发送图片/文件,服务端保存到本地,并回复“收到图片”。
核心:使用 BufferedInputStream 和 BufferedOutputStream 提高效率。
工具类:使用 StreamUtils 将输入流转换为字节数组或字符串,简化操作。
实际通信中,客户端也会使用一个随机端口与服务端通信。
可使用 netstat -an 指令查看主机网络状态(监听端口和连接信息)。
核心类:DatagramSocket (数据报套接字) 和 DatagramPacket (数据包/数据报)。
无连接:每个数据包独立,包含发送方和接收方的IP与端口。
不可靠:不保证送达和顺序。
发送端:
创建 DatagramSocket 对象。
将数据封装到 DatagramPacket 对象中(指定数据、长度、目标IP、端口)。
调用 socket.send(packet) 发送。
可接收回复。
关闭 socket。
接收端:
创建 DatagramSocket 并在指定端口监听。
创建空的 DatagramPacket 对象用于接收。
调用 socket.receive(packet) 阻塞等待数据。
拆包 (packet.getData()) 处理数据。
可回复数据。
关闭 socket。
如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


