Java作为一种广泛使用的编程语言,在网络编程领域有着举足轻重的地位。通过Java网络编程,我们可以轻松搭建各种实用网络应用项目。本文将为您提供一份实战指南,帮助您从基础到实战,全面掌握Java网络编程。

一、Java网络编程基础

1.1 Java网络编程概述

Java网络编程主要基于Java的java.net包,提供了丰富的网络编程API。通过这些API,我们可以实现TCP/IP、UDP、HTTP等网络协议的编程。

1.2 常用网络编程类

  • InetAddress:用于获取和操作IP地址。
  • Socket:用于实现TCP/IP网络通信。
  • ServerSocket:用于监听特定端口,等待客户端连接。
  • DatagramSocket:用于实现UDP网络通信。
  • URL:用于访问网络资源,如网页、图片等。

二、Java网络编程实战

2.1 TCP客户端与服务器

2.1.1 客户端

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

public class TcpClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 12345);
        OutputStream os = socket.getOutputStream();
        PrintWriter out = new PrintWriter(os, true);
        out.println("Hello, server!");

        InputStream is = socket.getInputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println("Server says: " + line);
        }

        socket.close();
    }
}

2.1.2 服务器

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

public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("Server is listening on port 12345...");

        Socket socket = serverSocket.accept();
        System.out.println("Client connected!");

        InputStream is = socket.getInputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println("Client says: " + line);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("Hello, client!");
        }

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

2.2 UDP客户端与服务器

2.2.1 客户端

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

public class UdpClient {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        byte[] data = "Hello, server!".getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, address, 12345);
        socket.send(packet);

        byte[] buffer = new byte[1024];
        DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
        socket.receive(receivedPacket);
        String receivedData = new String(receivedPacket.getData(), 0, receivedPacket.getLength());
        System.out.println("Server says: " + receivedData);

        socket.close();
    }
}

2.2.2 服务器

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

public class UdpServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(12345);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        socket.receive(packet);
        String receivedData = new String(packet.getData(), 0, packet.getLength());
        System.out.println("Client says: " + receivedData);

        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        String reply = "Hello, client!";
        byte[] data = reply.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(data, data.length, address, port);
        socket.send(sendPacket);

        socket.close();
    }
}

2.3 HTTP客户端与服务器

2.3.1 客户端

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

public class HttpClient {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://www.example.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        int responseCode = connection.getResponseCode();
        System.out.println("Response Code: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) {
            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());
        }

        connection.disconnect();
    }
}

2.3.2 服务器

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

public class HttpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("Server is listening on port 8080...");

        while (true) {
            Socket socket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String request = in.readLine();
            System.out.println("Request: " + request);

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("HTTP/1.1 200 OK");
            out.println("Content-Type: text/plain");
            out.println();
            out.println("Hello, world!");

            socket.close();
        }
    }
}

三、总结

通过本文的实战指南,您应该已经掌握了Java网络编程的基本知识和一些常用网络协议的编程方法。在实际项目中,可以根据需求选择合适的网络编程技术,实现各种实用网络应用。祝您在Java网络编程的道路上越走越远!