javax.net网络编程完全指南:核心类解析与实战代码示例

2024-06-21 李腾 134 次阅读 0 次点赞
javax.net是Java标准库中网络编程的核心包,提供创建网络连接的基础类和接口。本文详细解析SocketFactory、ServerSocketFactory、Socket和ServerSocket四大核心组件,通过完整的代码示例展示基础客户端服务器通信、自定义SocketFactory实现以及多线程服务器开发。每个示例都包含详细的代码注释和异常处理,帮助开发者快速掌握Java网络编程的实际应用技巧,适用于各种网络服务通信和自定义协议实现场景。

javax.net 包是 Java 标准库中用于网络编程的核心包之一,提供了创建网络连接的基础类和接口。它主要包含以下核心组件:

主要类和接口

1. SocketFactory

用于创建客户端套接字的工厂类

2. ServerSocketFactory

用于创建服务器套接字的工厂类

3. Socket

表示客户端套接字

4. ServerSocket

表示服务器端套接字

示例代码

1. 基础 Socket 客户端示例

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

public class BasicSocketClient {
    public static void main(String[] args) {
        try {
            // 使用默认的 SocketFactory 创建 Socket
            SocketFactory factory = SocketFactory.getDefault();
            Socket socket = factory.createSocket("localhost", 8080);
            
            // 获取输出流发送数据
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("Hello Server!");
            
            // 获取输入流接收响应
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String response = reader.readLine();
            System.out.println("Server response: " + response);
            
            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 基础 ServerSocket 服务器示例

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

public class BasicSocketServer {
    public static void main(String[] args) {
        try {
            // 使用默认的 ServerSocketFactory 创建 ServerSocket
            ServerSocketFactory factory = ServerSocketFactory.getDefault();
            ServerSocket serverSocket = factory.createServerSocket(8080);
            
            System.out.println("Server started on port 8080");
            
            while (true) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("Client connected: " + clientSocket.getInetAddress());
                
                // 处理客户端请求
                handleClient(clientSocket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void handleClient(Socket clientSocket) {
        try {
            // 获取输入流读取客户端数据
            InputStream input = clientSocket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String message = reader.readLine();
            System.out.println("Received from client: " + message);
            
            // 发送响应
            OutputStream output = clientSocket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("Hello Client! I received your message: " + message);
            
            // 关闭连接
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 自定义 SocketFactory 示例

import javax.net.SocketFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

// 自定义 SocketFactory
public class CustomSocketFactory extends SocketFactory {
    private final SocketFactory defaultFactory = SocketFactory.getDefault();
    
    @Override
    public Socket createSocket(String host, int port) throws IOException {
        System.out.println("Creating socket to " + host + ":" + port);
        Socket socket = defaultFactory.createSocket(host, port);
        // 可以在这里添加自定义配置
        socket.setSoTimeout(5000); // 设置超时时间
        return socket;
    }
    
    @Override
    public Socket createSocket(String host, int port, InetAddress localAddr, int localPort) 
            throws IOException {
        System.out.println("Creating socket to " + host + ":" + port + 
                          " from local address " + localAddr + ":" + localPort);
        return defaultFactory.createSocket(host, port, localAddr, localPort);
    }
    
    @Override
    public Socket createSocket(InetAddress address, int port) throws IOException {
        System.out.println("Creating socket to " + address + ":" + port);
        return defaultFactory.createSocket(address, port);
    }
    
    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddr, int localPort) 
            throws IOException {
        return defaultFactory.createSocket(address, port, localAddr, localPort);
    }
}

// 使用自定义 SocketFactory 的客户端
public class CustomSocketClient {
    public static void main(String[] args) {
        try {
            SocketFactory customFactory = new CustomSocketFactory();
            Socket socket = customFactory.createSocket("localhost", 8080);
            
            // 使用 socket 进行通信...
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 多线程服务器示例

import javax.net.ServerSocketFactory;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedServer {
    private static final int THREAD_POOL_SIZE = 10;
    private static final ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    
    public static void main(String[] args) {
        try {
            ServerSocketFactory factory = ServerSocketFactory.getDefault();
            ServerSocket serverSocket = factory.createServerSocket(8080);
            
            System.out.println("Multi-threaded server started on port 8080");
            
            while (true) {
                Socket clientSocket = serverSocket.accept();
                // 为每个客户端连接创建新线程处理
                executor.execute(new ClientHandler(clientSocket));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }
    
    static class ClientHandler implements Runnable {
        private final Socket clientSocket;
        
        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }
        
        @Override
        public void run() {
            try {
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
                
                String message;
                while ((message = reader.readLine()) != null) {
                    System.out.println("Received: " + message);
                    writer.println("Echo: " + message);
                    
                    if ("bye".equalsIgnoreCase(message)) {
                        break;
                    }
                }
                
                clientSocket.close();
                System.out.println("Client disconnected: " + clientSocket.getInetAddress());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

主要特点

1、工厂模式:使用工厂类创建套接字,便于扩展和自定义

2、抽象化:提供了网络通信的抽象接口

3、可扩展性:可以通过继承创建自定义的 SocketFactory

4、与 javax.net.ssl 集成:为 SSL/TLS 通信提供基础

实际应用场景

1、客户端/服务器应用程序

2、网络服务通信

3、自定义网络协议实现

4、需要特殊套接字配置的场景

最后更新于5月前
本文由人工编写,AI优化,转载请注明原文地址: javax.net使用指南:Java网络编程核心类与代码实例详解

评论 (3)

登录 后发表评论

墨染青衣墨染青衣2025-11-30 13:05:45

很棒的教程!代码示例很清晰,让我对javax.net包的使用有了直观的理解。感谢作者的分享!

马可马可2025-11-29 18:40:11

很实用的javax.net使用指南!代码示例清晰易懂,对我理解Socket编程帮助很大。感谢作者的详细分享!

微笑的向日葵微笑的向日葵2025-11-26 19:25:32

很详细的javax.net使用指南!代码示例很实用,让我对Socket和ServerSocket的用法有了清晰的理解。感谢作者的分享!