Java 网络编程详解
                           
天天向上
发布: 2025-03-03 23:14:25

原创
535 人浏览过

Java 网络编程(Network Programming)主要用于处理 TCP/IPUDPSocket 通信,支持 客户端-服务器(C/S)模型 以及 HTTP 请求


1. Java 网络编程基础

1.1 Java 网络编程核心 API

Java 提供了一系列网络相关的 API,主要包括:

作用
InetAddress处理 IP 地址(IPv4 / IPv6)
Socket实现 TCP 客户端
ServerSocket实现 TCP 服务器端
DatagramSocket实现 UDP 通信
DatagramPacket处理 UDP 数据包
URL / URLConnection处理 HTTP / FTP

2. Java InetAddress(IP 地址类)

InetAddress 代表 IP 地址,用于处理主机名和 IP 之间的转换。

2.1 获取本机和远程 IP

import java.net.*;

public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        // 获取本机 IP
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println("本机 IP: " + localHost.getHostAddress());

        // 获取远程主机 IP
        InetAddress remoteHost = InetAddress.getByName("www.google.com");
        System.out.println("Google IP: " + remoteHost.getHostAddress());
    }
}

3. Java TCP 通信

TCP(传输控制协议)是面向连接的可靠通信协议。

3.1 TCP 服务器端

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

public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); // 监听 9999 端口
        System.out.println("服务器启动,等待连接...");

        Socket socket = serverSocket.accept(); // 等待客户端连接
        System.out.println("客户端已连接:" + socket.getInetAddress());

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = in.readLine();
        System.out.println("收到消息:" + message);

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Hello, Client!");

        in.close();
        out.close();
        socket.close();
        serverSocket.close();
    }
}

3.2 TCP 客户端

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

public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9999); // 连接服务器

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Hello, Server!");

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("服务器回复:" + in.readLine());

        in.close();
        out.close();
        socket.close();
    }
}

4. Java UDP 通信

UDP(用户数据报协议)是无连接的通信协议,适用于高速传输但不保证可靠性。

4.1 UDP 服务器端

import java.net.*;

public class UDPServer {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buffer = new byte[1024];

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        System.out.println("UDP 服务器已启动,等待数据...");

        socket.receive(packet); // 接收数据
        String message = new String(packet.getData(), 0, packet.getLength());
        System.out.println("收到消息:" + message);

        socket.close();
    }
}

4.2 UDP 客户端

import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("localhost");

        String message = "Hello, UDP Server!";
        byte[] buffer = message.getBytes();

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8888);
        socket.send(packet); // 发送数据

        System.out.println("数据已发送!");
        socket.close();
    }
}

5. Java 处理 HTTP 请求

Java 提供 URLURLConnection 处理 HTTP 访问。

5.1 发送 HTTP GET 请求

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

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

        connection.setRequestMethod("GET"); // 发送 GET 请求
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

        in.close();
        connection.disconnect();
    }
}

6. Java 多线程 Socket 服务器

6.1 多线程处理多个客户端

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

class ClientHandler extends Thread {
    private Socket clientSocket;

    public ClientHandler(Socket socket) {
        this.clientSocket = socket;
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String message = in.readLine();
            System.out.println("收到客户端消息:" + message);
            out.println("服务器收到:" + message);

            in.close();
            out.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class MultiThreadedServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("多线程服务器启动,等待客户端连接...");

        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接:" + clientSocket.getInetAddress());
            new ClientHandler(clientSocket).start();
        }
    }
}

7. Java NIO(非阻塞 IO)

Java NIO(New IO)提供了高性能的网络通信能力,适用于高并发场景(如聊天室、Web 服务器)。

7.1 NIO 服务器

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;

public class NioServer {
    public static void main(String[] args) throws IOException {
        Selector selector = Selector.open();
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.bind(new InetSocketAddress(9999));
        serverChannel.configureBlocking(false);
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);

        System.out.println("NIO 服务器启动...");

        while (true) {
            selector.select();
            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    SocketChannel clientChannel = serverChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = clientChannel.read(buffer);
                    if (bytesRead > 0) {
                        System.out.println("收到:" + new String(buffer.array()).trim());
                    }
                }
            }
        }
    }
}

总结

Socket 适用于 TCP 连接
DatagramSocket 适用于 UDP
URLConnection 适用于 HTTP 访问
NIO 适用于高并发网络通信

更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *