第 13 章 · 网络编程

13.1 网络基础

  • IP 地址:标识网络中的主机(IPv4/IPv6);端口号:标识主机上的进程(0~65535)。
  • InetAddress 类封装 IP 地址,提供 getByNamegetHostAddress 等方法。
  • UDP:无连接、不可靠、速度快,适合实时性高、可容忍丢包(语音/视频)。
  • TCP:面向连接、可靠、有顺序,适合要求数据完整的场景(文件传输、Web)。

13.2 UDP 通信

UDP 用 DatagramPacket(数据报)封装数据,DatagramSocket 收发:

// 发送端
DatagramSocket socket = new DatagramSocket();
byte[] data = "hello".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length,
        InetAddress.getByName("127.0.0.1"), 9999);
socket.send(packet);
socket.close();
  • 无连接:发送方不确认接收方是否存在。
  • 适合聊天、广播等实时场景。

13.3 TCP 通信

TCP 用 Socket(客户端)与 ServerSocket(服务端)建立可靠连接:

// 服务端
ServerSocket server = new ServerSocket(9999);
Socket client = server.accept();                 // 阻塞等待连接
try (BufferedReader br = new BufferedReader(
        new InputStreamReader(client.getInputStream()))) {
    String line = br.readLine();                  // 读客户端数据
}

// 客户端
Socket socket = new Socket("127.0.0.1", 9999);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("hello");
  • accept() 阻塞等待客户端连接,连接建立后通过输入输出流收发数据。
  • 多线程服务端:每个连接交给一个线程处理,支持并发。
  • 文件上传:客户端读文件 → 写出字节流 → 服务端接收并保存。

13.4 与其他语言对比

  • C:直接操作 BSD socket(socket/bind/listen/accept),功能强大但繁琐、易错。
  • C++:底层同 C,或用 boost.asio 等库。
  • Pythonsocket 模块与 Java 类似,socketserver 提供更高层封装,代码更少。

关键差异:Java 把 socket 封装成 Socket/ServerSocket 类,屏蔽了 C 式底层系统调用的细节;网络 IO 本质仍是字节流,可与第 12 章 IO 流无缝衔接。现代高并发更推荐 NIO(java.nio 的 Selector/Channel)而非一线程一连接。