Java 网络编程基础详解:从 IP、端口到 TCP/UDP 实战
本文详细解析 Java 网络编程的核心概念与操作实践。内容涵盖如何定位主机(IP)、区分应用(端口)以及两种主要通信协议(UDP 与 TCP)。通过完整的 Java 代码示例,演示了 Socket 连接的建立、三次握手过程、双向文本传输、文件上传功能以及基于数据报的聊天实现。
网络通信的要素与原理
网络编程旨在解决两个核心问题:如何在互联网中定位目标主机,以及如何确保主机间数据的可靠通信。这构成了网络编程的三大基本要素:IP 地址、端口号和通信协议。
1. IP 地址与 InetAddress
IP 地址是网络上设备的唯一标识。常见的 IPv4 地址如 127.0.0.1 或域名 localhost 指向本机,即使断网也可访问。Java 提供了 InetAddress 类来处理 IP 相关操作,例如解析域名对应的 IP 或获取本机地址。
public class TestInetAddress {
public static void main(String[] args) {
try {
// 查询网站 IP 地址
InetAddress ip1 = InetAddress.getByName("www.baidu.com");
System.out.println(ip1);
// 查询本机信息
InetAddress ip2 = InetAddress.getLocalHost();
System.out.println(ip2);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2. 端口号 (Port)
若 IP 定位设备,端口则定位设备上的应用程序。TCP 和 UDP 协议的端口范围均为 0~65535。常见分类如下:
- 公有端口 (0-1023):如 HTTP (80)、HTTPS (443)、FTP (21)。
- 程序注册端口 (1024-49151):如 Tomcat (8080)、MySQL (3306)。
通信协议对比:UDP vs TCP
UDP 协议:无连接,效率高
用户数据报协议 (UDP) 在传输前不建立逻辑连接,发送端直接发数据,接收端也不反馈。其优点是消耗资源小、效率高,适用于视频会议等允许少量丢包的场景。缺点是面向无连接,无法保证数据完整性。
TCP 协议:有连接,可靠传输
传输控制协议 (TCP) 强调“三次握手”建立稳定连接,确保数据可靠无差错传输。
- 第一次握手:客户端向服务端发出连接请求。
- 第二次握手:服务端回应确认请求。
- 第三次握手:客户端再次确认,连接正式建立。
形象记忆:A:"你愁啥?" → B:"瞅你咋地?" → A:"来干一场!"
TCP 通信实战:文本与文件传输
在 Java 中,Socket 代表客户端连接,ServerSocket 代表服务器监听端口。以下以本地回环地址 127.0.0.1 为例进行演示。
第 1 步:基础文本通信
客户端通过输出流向服务器发送字符串;服务器通过输入流阻塞读取并打印消息。注意操作完成后需关闭资源。
客户端示例:
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
try {
// 1. 确定服务器地址和端口
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
// 2. 创建 Socket 连接
socket = new Socket(serverIP, port);
// 3. 发送消息
os = socket.getOutputStream();
os.write("你好,吃饭了吗?".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (os != null) try { os.close(); } catch (IOException e) { e.printStackTrace(); }
if (socket != null) try { socket.close(); } catch (IOException e) { e.printStackTrace(); }
}
}
}
服务器示例:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo01 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
Socket socket = serverSocket.accept(); // 等待连接
InputStream stream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = stream.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
System.out.println(baos.toString());
}
}
}
第 2 步:文件上传操作
文件传输需使用字节流。客户端将文件分块写入 OutputStream,并通过 shutdownOutput() 通知服务器传输结束;服务器保存为本地文件后返回成功提示。
// 客户端文件上传片段
FileInputStream fis = new FileInputStream("bg.jpeg");
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
socket.shutdownOutput(); // 通知服务器已写完
服务器端接收文件并存入磁盘后,断开连接:fos.close(); socket.close();。
UDP 通信实战:即时聊天
UDP 使用 DatagramSocket 和 DatagramPacket 实现。无需预先建立连接,适合简单的聊天室场景。
// 发送方
DatagramSocket socket = new DatagramSocket(8888);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String data;
while ((data = reader.readLine()) != null) {
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,
new InetSocketAddress("localhost", 9999));
socket.send(packet);
if ("bye".equals(data)) break;
}
socket.close();
接收方在指定端口阻塞等待数据包,收到后解码并打印。双方均可输入 bye 退出聊天循环。
URL 下载网络资源
利用 URL 协议可以直接下载互联网上的资源。通过 HttpURLConnection 打开连接,读取输入流并逐块写入本地文件即可。
URL url = new URL("https://example.com/resource.mp3");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
// ... 读取流并写入 FileOutputStream ...
connection.disconnect();
总结
以上关于 Java 网络编程的基础详解,涵盖了从寻址机制到具体通信协议的完整操作流程。掌握了 Socket 编程与 IO 流的结合,便能轻松构建可靠的网络应用。更多关于 Java 技术进阶的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









