Java 网络编程基础详解:从 IP、端口到 TCP/UDP 实战

Ivy
Ivy
发布时间:2026-10-16 | 3人浏览过
原创

本文详细解析 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) 强调“三次握手”建立稳定连接,确保数据可靠无差错传输。

  1. 第一次握手:客户端向服务端发出连接请求。
  2. 第二次握手:服务端回应确认请求。
  3. 第三次握手:客户端再次确认,连接正式建立。

形象记忆: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 技术进阶的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表