Java作为一种广泛使用的编程语言,在网络编程领域有着举足轻重的地位。无论是构建企业级应用,还是开发移动端、桌面端应用程序,Java网络编程都是不可或缺的一部分。本文将带领你轻松上手Java网络编程,通过实战案例详解,助你快速掌握网络编程技能。

Java网络编程基础

在开始实战之前,我们需要了解Java网络编程的基础知识。Java提供了丰富的网络编程API,主要包括:

  • java.net:提供了一系列网络编程的基础类,如InetAddress、Socket等。
  • java.io:提供了输入输出流相关的类,如InputStream、OutputStream等,在网络编程中用于数据的传输。

InetAddress类

InetAddress类用于获取IP地址,可以用来解析域名或者获取本机的IP地址。以下是一个获取本机IP地址的示例代码:

import java.net.InetAddress;

public class Main {
    public static void main(String[] args) {
        try {
            InetAddress localMachine = InetAddress.getLocalHost();
            System.out.println("本机IP地址:" + localMachine.getHostAddress());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Socket类

Socket是Java网络编程的核心类,用于实现客户端和服务器之间的通信。Socket分为两种类型:TCP Socket和UDP Socket。

TCP Socket

TCP Socket提供可靠的、面向连接的服务。以下是一个简单的TCP客户端示例:

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

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

UDP Socket

UDP Socket提供无连接的服务,适用于对实时性要求较高的场景。以下是一个简单的UDP客户端示例:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSocketClient {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket();
            String message = "Hello, Server!";
            byte[] outBuf = message.getBytes();
            InetAddress IPAddress = InetAddress.getByName("127.0.0.1");
            DatagramPacket outPacket = new DatagramPacket(outBuf, outBuf.length, IPAddress, 1234);
            socket.send(outPacket);
            byte[] inBuf = new byte[1024];
            DatagramPacket inPacket = new DatagramPacket(inBuf, inBuf.length);
            socket.receive(inPacket);
            System.out.println("Server response: " + new String(inBuf, 0, inPacket.getLength()));
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

实战案例详解

案例一:文件传输

本案例将通过TCP Socket实现客户端和服务器之间的文件传输。

服务器端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FileTransferServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(1234);
            System.out.println("文件传输服务器启动,等待客户端连接...");
            Socket socket = serverSocket.accept();
            System.out.println("客户端连接成功!");
            InputStream is = socket.getInputStream();
            FileOutputStream fos = new FileOutputStream("received_file.txt");
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) != -1) {
                fos.write(buffer, 0, length);
            }
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();
            System.out.println("文件传输完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端

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

public class FileTransferClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 1234);
            System.out.println("连接到服务器...");
            FileInputStream fis = new FileInputStream("sent_file.txt");
            OutputStream os = socket.getOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                os.write(buffer, 0, length);
            }
            fis.close();
            os.close();
            socket.close();
            System.out.println("文件发送完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

案例二:聊天室

本案例将通过TCP Socket实现一个简单的聊天室。

服务器端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
    private static List<PrintWriter> clients = new ArrayList<>();

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(1234);
            System.out.println("聊天室服务器启动,等待客户端连接...");
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("客户端连接成功!");
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                clients.add(out);
                new Thread(new ClientHandler(socket)).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class ClientHandler implements Runnable {
        private Socket socket;

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

        @Override
        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String message;
                while ((message = in.readLine()) != null) {
                    System.out.println("客户端:" + message);
                    for (PrintWriter client : clients) {
                        client.println("服务器:" + message);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

客户端

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

public class ChatClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 1234);
            System.out.println("连接到服务器...");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            String message;
            while ((message = in.readLine()) != null) {
                out.println(message);
            }
            in.close();
            out.close();
            socket.close();
            System.out.println("连接断开!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

通过本文的实战案例详解,相信你已经对Java网络编程有了初步的认识。在实际开发中,网络编程的应用场景非常广泛,如文件传输、聊天室、在线游戏等。希望本文能帮助你轻松上手Java网络编程,为你的职业生涯添砖加瓦。