在数字化时代,网络编程是软件开发不可或缺的一部分。Java作为一种跨平台的语言,在网络编程领域有着广泛的应用。本文将带你从入门到实战,全面了解Java网络编程,轻松实现数据传输。

一、Java网络编程基础

1. 网络通信模型

在Java中,网络通信主要基于TCP/IP协议。TCP/IP协议分为四层:应用层、传输层、网络层和数据链路层。Java网络编程主要涉及传输层和网络层。

2. Java网络编程API

Java提供了丰富的网络编程API,包括:

  • java.net包:提供URL、InetAddress、Socket等类。
  • java.nio包:提供NIO(非阻塞I/O)相关类,如Selector、Channel、Buffer等。

二、Java网络编程实战

1. 基本网络编程

TCP客户端

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

public class TcpClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("127.0.0.1", 6666);
             PrintWriter out = new PrintWriter(socket.getOutputStream());
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            out.println("Hello, Server!");
            System.out.println("Server: " + in.readLine());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TCP服务器

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(6666);
             Socket socket = serverSocket.accept();
             PrintWriter out = new PrintWriter(socket.getOutputStream());
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println("Client: " + line);
                out.println("Hello, Client!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. NIO编程

NIO客户端

import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NioClient {
    public static void main(String[] args) {
        try (SocketChannel socketChannel = SocketChannel.open()) {
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 6666));
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            buffer.put("Hello, Server!".getBytes());
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
            int readBytes = socketChannel.read(buffer);
            System.out.println("Server: " + new String(buffer.array(), 0, readBytes));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

NIO服务器

import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NioServer {
    public static void main(String[] args) {
        try (Selector selector = Selector.open();
             ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
            serverSocketChannel.bind(new InetSocketAddress(6666));
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            while (true) {
                selector.select();
                Set<SelectionKey> keys = selector.selectedKeys();
                Iterator<SelectionKey> keyIterator = keys.iterator();
                while (keyIterator.hasNext()) {
                    SelectionKey key = keyIterator.next();
                    if (key.isAcceptable()) {
                        registerClient(selector, serverSocketChannel);
                    } else if (key.isReadable()) {
                        readData(key);
                    }
                    keyIterator.remove();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void registerClient(Selector selector, ServerSocketChannel serverSocketChannel) throws IOException {
        SocketChannel client = serverSocketChannel.accept();
        client.configureBlocking(false);
        client.register(selector, SelectionKey.OP_READ);
    }

    private static void readData(SelectionKey key) throws IOException {
        SocketChannel client = (SocketChannel) key.channel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        int readBytes = client.read(buffer);
        if (readBytes > 0) {
            System.out.println("Client: " + new String(buffer.array(), 0, readBytes));
            buffer.clear();
        }
    }
}

3. HTTP客户端和服务器

HTTP客户端

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpClient {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

HTTP服务器

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket clientSocket = serverSocket.accept();
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String request = in.readLine();
                OutputStream out = clientSocket.getOutputStream();
                out.write("HTTP/1.1 200 OK\r\n".getBytes());
                out.write("Content-Type: text/plain\r\n\r\n".getBytes());
                out.write("Hello, World!".getBytes());
                out.close();
                in.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、总结

通过本文的学习,相信你已经掌握了Java网络编程的基础知识和实战技巧。在实际开发中,不断积累经验,提高自己的编程能力,才能在网络编程领域游刃有余。祝你在网络编程的道路上越走越远!