Skip to content

Java 网络编程

网络编程允许计算机之间通过网络进行通信。Java 提供了强大的 java.net 包,使开发者能够轻松地创建网络应用程序,无论是基于 TCP 还是 UDP 协议。

网络基础

  • IP 地址 (IP Address): 网络上每台计算机的唯一标识符。Java 使用 InetAddress 类来表示 IP 地址。
  • 端口 (Port): 一个 16 位的数字(0-65535),用于标识计算机上特定的应用程序或服务。一个 IP 地址和一个端口号组合起来,就能唯一确定网络上的一个进程。
  • 套接字 (Socket): 是网络通信的端点。两个应用程序通过一对套接字(包含 IP 地址和端口)建立连接,进行数据交换。

InetAddress

InetAddress 类用于表示 IP 地址,它没有公共构造方法,只能通过静态方法创建实例。

java
import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressExample {
    public static void main(String[] args) {
        try {
            // 获取本地主机的地址
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("本地主机名: " + localHost.getHostName());
            System.out.println("本地 IP 地址: " + localHost.getHostAddress());

            // 根据域名获取地址
            InetAddress googleHost = InetAddress.getByName("www.google.com");
            System.out.println("\nGoogle 主机名: " + googleHost.getHostName());
            System.out.println("Google IP 地址: " + googleHost.getHostAddress());

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

TCP 编程

TCP (Transmission Control Protocol) 是一种面向连接、可靠的协议。通信双方需要先建立连接,然后才能进行数据传输,类似于打电话。

  • ServerSocket: 用于服务器端,监听指定的端口,等待客户端的连接请求。
  • Socket: 用于客户端或服务器端,代表一个网络连接的两端之一。

TCP 服务器端示例

java
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        // 1. 创建一个 ServerSocket,监听 8080 端口
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("服务器已启动,等待客户端连接...");

        // 2. 调用 accept() 方法,阻塞等待客户端连接
        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端已连接: " + clientSocket.getInetAddress().getHostAddress());

        // 3. 获取输出流,向客户端发送数据
        OutputStream os = clientSocket.getOutputStream();
        os.write("Hello, Client! You are connected.".getBytes());
        os.flush();

        // 4. 关闭资源
        os.close();
        clientSocket.close();
        serverSocket.close();
    }
}

TCP 客户端示例

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        // 1. 创建一个 Socket,连接到服务器的 IP 和端口
        Socket socket = new Socket("127.0.0.1", 8080);
        System.out.println("已连接到服务器。");

        // 2. 获取输入流,读取服务器发送的数据
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String serverMessage = br.readLine();
        System.out.println("收到服务器消息: " + serverMessage);

        // 3. 关闭资源
        br.close();
        socket.close();
    }
}

UDP 编程

UDP (User Datagram Protocol) 是一种无连接、不可靠的协议。它不需要建立连接,直接将数据包(Datagram)发送到目标地址,速度快但可能丢包,类似于寄信。

  • DatagramSocket: 用于发送和接收数据报包。
  • DatagramPacket: 用于封装要发送或接收的数据。

UDP 发送端示例

java
import java.io.IOException;
import java.net.*;

public class UdpSender {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String message = "Hello, UDP Receiver!";
        byte[] data = message.getBytes();
        InetAddress receiverAddress = InetAddress.getByName("127.0.0.1");
        int receiverPort = 9090;

        // 创建数据包
        DatagramPacket packet = new DatagramPacket(data, data.length, receiverAddress, receiverPort);
        
        // 发送数据包
        socket.send(packet);
        System.out.println("消息已发送。");
        socket.close();
    }
}

UDP 接收端示例

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

public class UdpReceiver {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9090);
        byte[] buffer = new byte[1024];

        // 创建接收数据包
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 接收数据(阻塞)
        socket.receive(packet);

        String receivedMessage = new String(packet.getData(), 0, packet.getLength());
        System.out.println("收到消息: " + receivedMessage);
        socket.close();
    }
}

URL 编程

Java 还提供了高级 API 来处理 URL,方便地访问 Web 资源。

  • URL: 代表一个统一资源定位符。
  • URLConnection: 可用于读取和写入 URL 指向的资源。
java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class UrlExample {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://www.example.com");
        URLConnection connection = url.openConnection();

        // 读取网页内容
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

本站内容仅供学习和研究使用。