Java_网络编程

Java 网络编程的核心,就是让两个(或多个)Java 程序(可能在同一台电脑,也可能在不同电脑)通过网络交换数据。你可以把它理解成:写代码让两台电脑 “隔空对话”,比如客户端给服务器发消息、服务器返回数据,这就是最基础的网络编程。
 

一、核心概念(先搞懂这些,不绕晕)

 

1. 两个核心协议:TCP vs UDP(大白话区分)

 
协议类型 特点(大白话) 适用场景
TCP 像打电话:先拨号建立连接,说话能保证对方听到,还能确认顺序,丢了会重发 要求数据可靠的场景(比如文件传输、登录注册、聊天)
UDP 像发短信:不用建立连接,直接发,不管对方收没收到,速度快 要求速度不要求 100% 可靠的场景(比如直播、游戏、视频通话)
 

2. 关键类 / 接口(Java 帮我们封装好了,不用自己写底层)

 
  • InetAddress:表示 IP 地址(比如把 “127.0.0.1” 或 “localhost” 封装成对象);
  • ServerSocket:TCP 服务器端专用,用来 “监听” 客户端的连接请求;
  • Socket:TCP 客户端 / 服务器端的 “通信管道”,通过它收发数据;
  • DatagramSocket/DatagramPacket:UDP 专用,用来发送 / 接收 “数据包”。

二、实战案例(从简单到复杂,直接跑通)

案例 1:TCP 基础通信(客户端发消息,服务器回消息)

这是最经典的 Java 网络编程入门案例,先建服务器,再建客户端,实现双向对话。

1. TCP 服务器端代码

java
 
运行
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

// TCP服务器:监听端口,接收客户端消息并回复
public class TcpServer {
    public static void main(String[] args) {
        // 1. 定义监听端口(建议用1024以上,避免占用系统端口)
        int port = 8888;
        
        try (
            // 2. 创建ServerSocket,监听指定端口
            ServerSocket serverSocket = new ServerSocket(port);
            // 3. 等待客户端连接(accept()是阻塞方法,有连接才会继续)
            Socket socket = serverSocket.accept();
            // 4. 获取输入流(读客户端发的消息)
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 5. 获取输出流(给客户端回消息)
            OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream())
        ) {
            System.out.println("客户端已连接:" + socket.getInetAddress());
            
            // 6. 读取客户端消息
            String clientMsg = br.readLine();
            System.out.println("收到客户端消息:" + clientMsg);
            
            // 7. 给客户端回复消息
            String serverMsg = "已收到你的消息:" + clientMsg;
            osw.write(serverMsg + "\n"); // 加换行,客户端才能用readLine()读取
            osw.flush(); // 刷新缓冲区,确保消息发出去
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

2. TCP 客户端代码

java
 
运行
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

// TCP客户端:连接服务器,发消息并接收回复
public class TcpClient {
    public static void main(String[] args) {
        // 1. 服务器IP(本地测试用localhost,远程用服务器实际IP)
        String serverIp = "localhost";
        // 2. 服务器端口(必须和服务器端一致)
        int port = 8888;
        
        try (
            // 3. 创建Socket,连接服务器
            Socket socket = new Socket(serverIp, port);
            // 4. 获取输出流(给服务器发消息)
            OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
            // 5. 获取输入流(读服务器回复)
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))
        ) {
            // 6. 给服务器发消息
            String clientMsg = "Hello Java网络编程!";
            osw.write(clientMsg + "\n");
            osw.flush();
            
            // 7. 读取服务器回复
            String serverMsg = br.readLine();
            System.out.println("收到服务器回复:" + serverMsg);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

运行步骤(新手必看)

  1. 先运行TcpServer(服务器启动,等待连接);
  2. 再运行TcpClient(客户端连接服务器,发消息);
  3. 服务器控制台输出:客户端已连接:/127.0.0.1 + 收到客户端消息:Hello Java网络编程!
  4. 客户端控制台输出:收到服务器回复:已收到你的消息:Hello Java网络编程!
 

案例 2:UDP 简单通信(无连接,直接发消息)

 
UDP 不用建立连接,代码更简单,但不保证消息一定能收到。
 

1. UDP 发送端代码

java
 
运行
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

// UDP发送端:直接发数据包,不用连接
public class UdpSender {
    public static void main(String[] args) {
        try (
            // 1. 创建DatagramSocket(发送端端口可选,系统会自动分配)
            DatagramSocket socket = new DatagramSocket()
        ) {
            // 2. 要发送的消息
            String msg = "UDP消息:Hello!";
            byte[] data = msg.getBytes();
            
            // 3. 目标地址(服务器IP)和端口
            InetAddress targetIp = InetAddress.getByName("localhost");
            int targetPort = 9999;
            
            // 4. 封装成数据包
            DatagramPacket packet = new DatagramPacket(data, data.length, targetIp, targetPort);
            
            // 5. 发送数据包
            socket.send(packet);
            System.out.println("UDP消息已发送:" + msg);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

2. UDP 接收端代码

 
java
 
运行
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

// UDP接收端:监听端口,接收数据包
public class UdpReceiver {
    public static void main(String[] args) {
        int port = 9999;
        
        try (
            // 1. 创建DatagramSocket,绑定指定端口
            DatagramSocket socket = new DatagramSocket(port)
        ) {
            // 2. 创建空数据包,用来接收数据(缓冲区大小建议1024)
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            
            System.out.println("UDP接收端已启动,监听端口:" + port);
            // 3. 接收数据包(阻塞方法,有数据才会继续)
            socket.receive(packet);
            
            // 4. 解析数据包内容
            String msg = new String(packet.getData(), 0, packet.getLength());
            System.out.println("收到UDP消息:" + msg);
            System.out.println("发送方IP:" + packet.getAddress() + ",端口:" + packet.getPort());
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

三、进阶知识点(新手先了解,后续深入)

 
  1. 多线程服务器:上面的 TCP 服务器只能处理一个客户端,实际开发中需要用线程池,每来一个客户端就开一个线程处理(比如聊天服务器、Web 服务器);
  2. NIO(非阻塞 IO):传统的 Socket 是 “阻塞 IO”,NIO 可以用少量线程处理大量客户端连接,适合高并发场景(比如 Netty 框架就是基于 NIO);
  3. URL/URLConnection:Java 封装了访问网页的工具,比如通过URL类读取网页内容、下载文件,不用自己写底层 TCP;
  4. 常见框架:实际开发很少手写 Socket,常用 Netty(高性能网络框架)、Tomcat(Web 服务器,基于 Java 网络编程)等。

四、常见坑(新手避坑)

  1. 端口被占用:运行服务器时如果报错 “Address already in use”,换个端口(比如 8888 换成 8889),或关闭占用端口的程序;
  2. 防火墙 / 网络问题:远程连接时,确保服务器端口开放,防火墙没拦截;
  3. 流未关闭 / 刷新:发送消息后要flush(),用完流要关闭(建议用 try-with-resources 自动关闭);
  4. UDP 数据包大小:单个 UDP 数据包不能超过 64KB,否则会被截断。

总结

  1. Java 网络编程核心是基于 TCP/UDP 协议,通过 Socket 相关类实现跨程序数据交互
  2. TCP 可靠但稍慢,适合数据不能丢的场景;UDP 快但不可靠,适合实时性要求高的场景;
  3. 新手先掌握基础 TCP/UDP 通信案例,再学习多线程、NIO 和框架,逐步深入。
posted @ 2026-01-06 11:22  小java  阅读(24)  评论(0)    收藏  举报