在学习 Java 的过程中,网络编程是非常重要的一环。无论是后端开发、分布式系统、即时通讯、文件传输,还是游戏服务、物联网设备,都离不开网络通信


一、计算机网络基础

1.1 什么是计算机网络

不同地理位置、具有独立功能的计算机,通过通信设备和传输介质连接起来,使用  网络软件(协议) 实现资源共享和信息传递的系统,就叫计算机网络。

简单说:计算机之间想要互相传数据,就必须连网。

1.2 网络编程的作用

网络编程的作用,就是让两台计算机之间能够传输数据

比如:

  • 聊天软件发消息
  • 浏览器访问网页
  • 手机 APP 请求服务器
  • 文件上传下载
  • 远程控制

这些都属于网络通信。

1.3 网络编程三要素

想要实现网络通信,必须具备三个要素:

  1. IP 地址
  2. 端口号
  3. 协议

1.3.1 IP 地址

IP 地址是计算机在网络中的唯一标识

相当于计算机的 “身份证号”。

格式:192.168.1.100

分类:

  • IPv4:32 位,表示范围 0~255.0~255.0~255.0~255
  • IPv6:128 位,解决地址不够用问题

特殊 IP:

  • 127.0.0.1:本机回环地址,代表自己
  • localhost:本机域名

1.3.2 端口号

端口号是应用程序的标识

一台电脑里有很多软件,每个软件都有一个端口号,用来区分不同程序。

端口号范围:0 ~ 65535

注意:

  • 0~1024:系统保留端口
  • 1024~65535:自定义可用

1.3.3 协议

协议就是计算机之间通信的规则

常见协议:

  • TCP:传输控制协议
  • UDP:用户数据报协议

二、网络编程相关 API

2.1 InetAddress 类(表示 IP)

作用:获取本机 IP、主机名、判断是否可达。

常用方法:

InetAddress.getLocalHost();       // 获取本机
InetAddress.getByName("主机名");   // 根据主机名获取
getHostName();    // 获取主机名
getHostAddress(); // 获取IP地址

示例代码:

public class Test1 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress ip = InetAddress.getLocalHost();
        System.out.println(ip.getHostName());
        System.out.println(ip.getHostAddress());
    }
}

运行结果:

主机名
192.168.xxx.xxx

2.2 端口号相关知识

端口号用来标识进程(应用程序)

一个 IP + 一个端口 = 套接字 Socket


三、UDP 协议(重点)

3.1 UDP 特点

  • 无连接
  • 不可靠
  • 速度快
  • 数据限制 64K
  • 不分客户端和服务器,只有发送端、接收端

适用场景:直播、语音、视频、游戏

3.2 UDP 通信原理

  1. 发送端打包数据,直接发送
  2. 接收端开启端口,等待接收
  3. 不保证一定到达
  4. 速度快

3.3 UDP 发送端代码步骤

  1. 创建发送端 Socket 对象
  2. 打包数据(数据、长度、IP、端口)
  3. 发送数据包
  4. 释放资源

代码:

public class UDPSend {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();

        System.out.println("准备发送数据,2秒后开始...");
        Thread.sleep(2000); // 给你确认的时间

        String str = "Hello UDP";
        byte[] bytes = str.getBytes();
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        int port = 10000;

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, ip, port);
        ds.send(dp);
        System.out.println("数据已发送!");

        ds.close();
    }
}

3.4 UDP 接收端代码步骤

  1. 创建接收端 Socket(必须指定端口)
  2. 创建数据包接收数据
  3. 接收数据
  4. 解析数据
  5. 关闭资源

代码:

public class UDPReceive {
    public static void main(String[] args) throws Exception {
        // 绑定10000端口
        DatagramSocket ds = new DatagramSocket(10000);
        System.out.println("接收端已启动,等待数据...");

        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        // 阻塞等待数据
        ds.receive(dp);

        byte[] data = dp.getData();
        int len = dp.getLength();
        System.out.println("收到数据:" + new String(data, 0, len));

        ds.close();
    }
}

运行方式:先启动接收端 → 再启动发送端


四、TCP 协议(重点、面试高频)

4.1 TCP 特点

  • 面向连接
  • 可靠传输
  • 速度比 UDP 慢
  • 无大小限制
  • 分为客户端(Socket)服务器端(ServerSocket)

适用场景:文件传输、浏览器、聊天

4.2 TCP 三次握手(建立连接)

作用:保证可靠连接

过程:

  1. 客户端发送请求
  2. 服务器响应
  3. 客户端确认连接

4.3 TCP 四次挥手(断开连接)

  1. 客户端请求关闭
  2. 服务器收到
  3. 服务器准备关闭
  4. 客户端确认关闭

4.4 TCP 客户端代码(Socket)

步骤:

  1. 创建 Socket 对象,指定 IP 和端口
  2. 获取输出流,写数据
  3. 释放资源

代码:

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 10000);

        OutputStream os = socket.getOutputStream();
        os.write("Hello TCP".getBytes());

        os.close();
        socket.close();
    }
}

4.5 TCP 服务器代码(ServerSocket)

步骤:

  1. 创建 ServerSocket,指定端口
  2. 调用 accept () 等待客户端连接
  3. 获取输入流,读取数据
  4. 释放资源

代码:

public class TCPServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(10000);

        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));

        is.close();
        socket.close();
        serverSocket.close();
    }
}

运行:先启动服务器 → 再启动客户端


五、TCP 实战案例(文件上传)

5.1 客户端步骤

  1. 读取本地文件(变成 byte [])
  2. 连接 TCP 服务器(IP + 端口)
  3. 把文件数据发给服务器
  4. 发送完毕,关闭输出流
  5. 等待服务器回复 “上传成功”

5.2 服务器步骤

  1. 绑定端口,等待客户端连接
  2. 接收客户端发来的文件数据
  3. 把数据写入本地,保存成文件
  4. 回复客户端 “上传成功”
  5. 关闭连接

客户端代码

public class FileUploadClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 10000);

        FileInputStream fis = new FileInputStream("test.txt");
        OutputStream os = socket.getOutputStream();

        byte[] bytes = new byte[1024];
        int len;
        while ((len = fis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }

        socket.shutdownOutput();

        fis.close();
        socket.close();
    }
}

服务器代码

public class FileUploadServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(10000);
        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream("receive.txt");

        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }

        fos.close();
        socket.close();
        serverSocket.close();
    }
}

六、TCP 群聊原理(简单讲解)

多个客户端连接服务器服务器使用多线程处理每一个客户端服务器收到消息后转发给所有客户端


七、UDP 和 TCP 对比

TCP

  • 面向连接
  • 可靠
  • 有客户端服务器
  • 速度慢
  • 适合文件传输、重要数据

UDP

  • 无连接
  • 不可靠
  • 速度快
  • 适合直播、视频、游戏

八、常见问题与错误总结

8.1 连接超时

  • IP 错误
  • 端口错误
  • 服务器未启动
  • 防火墙拦截

8.2 端口被占用

Address already in use

解决:换端口或关闭占用程序

8.3 先启动客户端报错

必须先启动服务器

九、文章总结

TCP 文件上传实战,核心是利用 TCP 的可靠连接特性,实现文件从客户端到服务端的完整传输;而 UDP 通信则是无连接的数据报传输,更适合轻量、低延迟的场景。

客户端负责读取本地文件并发送,服务端监听端口、接收数据并写入文件,两者通过字节流和缓冲区协作完成数据传递;UDP 则通过数据包直接收发,无需建立连接。

实际开发中,需根据场景选择合适的协议,同时注意端口占用、连接顺序、传输结束标记等问题,确保通信稳定、高效

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐