Java网络编程:构建现代分布式应用的核心技术

文章目录

    • 引言
    • Java网络编程基础
      • 网络编程模型概述
      • Socket编程基础
    • NIO与异步编程
      • NIO核心组件
      • 事件驱动编程模式
    • 高级网络编程技术
      • HTTP客户端编程
      • WebSocket编程
      • 网络安全编程
    • 性能优化与最佳实践
      • 连接池管理
      • 异步处理模式
      • 监控与调试
    • 框架与工具
      • Netty框架
      • Spring WebFlux
    • 实际应用场景
      • 微服务通信
      • 实时数据处理
    • 代码应用案例
      • 案例一:基于NIO的高性能TCP服务器
      • 案例二:基于CompletableFuture的异步HTTP客户端
      • 案例三:WebSocket实时聊天服务器
      • 案例四:基于Netty的高性能服务器


引言

在当今数字化时代,网络通信已成为软件应用不可或缺的组成部分。无论是微服务架构、分布式系统,还是移动应用与云服务的交互,Java网络编程都扮演着关键角色。本文将深入探讨Java网络编程的核心概念、关键技术和最佳实践,帮助开发者构建高效、可靠的网络应用。

Java网络编程基础

网络编程模型概述

Java提供了多种网络编程模型,从传统的阻塞式I/O到现代的异步非阻塞I/O。理解这些模型的特点和适用场景是掌握Java网络编程的基础。

传统的阻塞I/O模型使用Socket和ServerSocket类,适合连接数较少的应用场景。每个客户端连接都需要独立的线程处理,在高并发场景下会面临线程资源消耗过大的问题。

非阻塞I/O模型通过NIO(New I/O)包实现,使用Channel、Buffer和Selector等核心组件。这种模型允许单个线程管理多个网络连接,显著提高了系统的并发处理能力。

Socket编程基础

Socket编程是Java网络编程的基石。服务端通过ServerSocket监听指定端口,客户端通过Socket建立连接。建立连接后,双方可以通过输入输出流进行数据交换。

在实际开发中,需要注意连接的生命周期管理、异常处理和资源释放。使用try-with-resources语句可以确保网络资源的正确释放,避免资源泄漏问题。

NIO与异步编程

NIO核心组件

Java NIO引入了Channel、Buffer和Selector三个核心组件,为网络编程提供了更高效的解决方案。

Channel代表网络连接的抽象,支持双向数据传输。与传统的流式I/O不同,Channel可以进行非阻塞读写操作,提高了I/O操作的效率。

Buffer作为数据容器,提供了结构化的数据读写方式。通过position、limit和capacity三个指针的协调工作,Buffer实现了高效的数据管理。

Selector是NIO的核心组件,允许单个线程监控多个Channel的I/O事件。当某个Channel准备好进行I/O操作时,Selector会通知应用程序进行处理。

事件驱动编程模式

基于NIO的网络编程采用事件驱动模式,应用程序注册感兴趣的I/O事件,当事件发生时由Selector通知处理。这种模式显著降低了线程资源的消耗,提高了系统的并发处理能力。

在实现事件驱动编程时,需要合理设计事件处理逻辑,避免阻塞操作影响整体性能。通常采用状态机模式来管理连接的不同状态和相应的处理逻辑。

高级网络编程技术

HTTP客户端编程

现代Java应用经常需要与REST API进行交互。Java 11引入的HTTP Client API提供了现代化的HTTP客户端实现,支持HTTP/2、WebSocket和异步请求处理。

相比传统的HttpURLConnection,新的HTTP Client API提供了更简洁的编程接口和更强大的功能。支持链式调用的Builder模式使得构建HTTP请求变得更加直观和灵活。

WebSocket编程

WebSocket协议为Web应用提供了全双工的实时通信能力。Java通过JSR-356规范提供了标准的WebSocket API,支持注解驱动的端点定义和生命周期管理。

在实现WebSocket应用时,需要考虑连接管理、消息路由和错误处理等方面。合理的会话管理机制可以确保系统的稳定性和可扩展性。

网络安全编程

网络安全是现代应用不可忽视的重要方面。Java提供了完整的安全编程框架,包括SSL/TLS协议支持、证书管理和加密算法实现。

在实现安全网络通信时,需要正确配置SSL上下文、选择合适的加密套件和实现证书验证逻辑。定期更新安全配置和及时修复安全漏洞是维护系统安全的重要措施。

性能优化与最佳实践

连接池管理

在高并发场景下,频繁创建和销毁网络连接会带来显著的性能开销。使用连接池技术可以有效复用网络连接,降低系统资源消耗。

现代Java应用通常使用Apache HttpComponents或OkHttp等成熟的HTTP客户端库,这些库内置了连接池管理功能。合理配置连接池参数,如最大连接数、连接超时时间和空闲连接回收策略,对系统性能有重要影响。

异步处理模式

采用异步处理模式可以显著提高系统的并发处理能力。Java的CompletableFuture类提供了强大的异步编程支持,可以轻松实现非阻塞的网络操作。

在设计异步处理逻辑时,需要注意异常处理和资源管理。使用适当的线程池配置可以避免线程资源的浪费和系统性能的下降。

监控与调试

网络编程中的问题往往难以复现和调试。建立完善的监控体系和日志记录机制对于维护网络应用的稳定性至关重要。

使用JVM内置的监控工具和第三方APM工具可以帮助开发者及时发现和解决网络相关的性能问题。详细的网络操作日志记录有助于问题的定位和分析。

框架与工具

Netty框架

Netty是Java生态系统中最受欢迎的网络编程框架之一。它在NIO的基础上提供了更高层次的抽象和丰富的功能特性,包括编解码器、处理器链和内存管理等。

Netty的事件驱动架构和优化的内存管理使其在高性能网络应用开发中表现出色。许多知名的开源项目,如Elasticsearch、Apache Spark和gRPC等都使用Netty作为底层网络通信框架。

Spring WebFlux

Spring WebFlux是Spring框架提供的响应式Web框架,基于Reactor库实现。它提供了完整的响应式编程模型,支持非阻塞I/O和背压处理。

WebFlux特别适合I/O密集型的应用场景,能够以较少的线程资源处理大量的并发请求。与传统的Spring MVC相比,WebFlux在处理大量长连接和流式数据时具有明显优势。

实际应用场景

微服务通信

在微服务架构中,服务间的网络通信是系统正常运行的基础。Java网络编程技术为微服务通信提供了多种解决方案,包括REST API、gRPC和消息队列等。

选择合适的通信协议和序列化格式对系统性能有重要影响。考虑到延迟、吞吐量和可维护性等因素,需要在不同场景下做出合理的技术选择。

实时数据处理

现代应用越来越需要处理实时数据流,如股票价格、物联网传感器数据和用户行为数据等。Java网络编程技术结合流处理框架可以构建高效的实时数据处理系统。

使用WebSocket或Server-Sent Events等技术可以实现服务器向客户端的实时数据推送。结合消息队列和流处理框架,可以构建完整的实时数据处理管道。

代码应用案例

案例一:基于NIO的高性能TCP服务器

以下代码展示了如何使用Java NIO构建一个支持多客户端连接的TCP服务器,该服务器能够高效处理大量并发连接。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

public class HighPerformanceNIOServer {
    private static final int PORT = 8080;
    private static final int BUFFER_SIZE = 1024;
    
    private ServerSocketChannel serverSocketChannel;
    private Selector selector;
    private final ConcurrentHashMap<SocketChannel, ClientSession> clientSessions;
    private final AtomicLong messageCounter;
    
    public HighPerformanceNIOServer() {
        this.clientSessions = new ConcurrentHashMap<>();
        this.messageCounter = new AtomicLong(0);
    }
    
    public void start() throws IOException {
        selector = Selector.open();
        serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(PORT));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        
        System.out.println("NIO服务器启动,监听端口: " + PORT);
        
        while (true) {
            int readyChannels = selector.select();
            if (readyChannels == 0) continue;
            
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
            
            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                keyIterator.remove();
                
                if (key.isAcceptable()) {
                    handleAccept(key);
                } else if (key.isReadable()) {
                    handleRead(key);
                } else if (key.isWritable()) {
                    handleWrite(key);
                }
            }
        }
    }
    
    private void handleAccept(SelectionKey key) throws IOException {
        ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
        SocketChannel clientChannel = serverChannel.accept();
        clientChannel.configureBlocking(false);
        clientChannel.register(selector, SelectionKey.OP_READ);
        
        ClientSession session = new ClientSession(clientChannel);
        clientSessions.put(clientChannel, session);
        
        System.out.println("新客户端连接: " + clientChannel.getRemoteAddress());
    }
    
    private void handleRead(SelectionKey key) throws IOException {
        SocketChannel clientChannel = (SocketChannel) key.channel();
        ClientSession session = clientSessions.get(clientChannel);
        
        if (session == null) return;
        
        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
        int bytesRead = clientChannel.read(buffer);
        
        if (bytesRead == -1) {
            closeClient(clientChannel);
            return;
        }
        
        if (bytesRead > 0) {
            buffer.flip();
            byte[] data = new byte[buffer.remaining()];
            buffer.get(data);
            String message = new String(data);
            
            session.addMessage(message);
            messageCounter.incrementAndGet();
            
            // 回写数据到客户端
            String response = "服务器已收到: " + message;
            session.setResponseBuffer(ByteBuffer.wrap(response.getBytes()));
            key.interestOps(SelectionKey.OP_WRITE);
        }
    }
    
    private void handleWrite(SelectionKey key) throws IOException {
        SocketChannel clientChannel = (SocketChannel) key.channel();
        ClientSession session = clientSessions.get(clientChannel);
        
        if (session != null && session.hasResponse()) {
            ByteBuffer responseBuffer = session.getResponseBuffer();
            clientChannel.write(responseBuffer);
            
            if (!responseBuffer.hasRemaining()) {
                session.clearResponse();
                key.interestOps(SelectionKey.OP_READ);
            }
        }
    }
    
    private void closeClient(SocketChannel clientChannel) throws IOException {
        clientSessions.remove(clientChannel);
        clientChannel.close();
        System.out.println("客户端断开连接");
    }
    
    public static void main(String[] args) {
        try {
            new HighPerformanceNIOServer().start();
        } catch (IOException e) {
            System.err.println("服务器启动失败: " + e.getMessage());
        }
    }
    
    private static class ClientSession {
        private final SocketChannel channel;
        private final StringBuilder messageBuffer;
        private ByteBuffer responseBuffer;
        
        public ClientSession(SocketChannel channel) {
            this.channel = channel;
            this.messageBuffer = new StringBuilder();
        }
        
        public void addMessage(String message) {
            messageBuffer.append(message);
        }
        
        public void setResponseBuffer(ByteBuffer buffer) {
            this.responseBuffer = buffer;
        }
        
        public ByteBuffer getResponseBuffer() {
            return responseBuffer;
        }
        
        public boolean hasResponse() {
            return responseBuffer != null && responseBuffer.hasRemaining();
        }
        
        public void clearResponse() {
            responseBuffer = null;
        }
    }
}

案例二:基于CompletableFuture的异步HTTP客户端

此案例演示了如何使用Java 11的HTTP客户端API结合CompletableFuture实现高效的异步HTTP请求处理。

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;

public class AsyncHttpClientExample {
    private final HttpClient httpClient;
    private final ExecutorService executorService;
    
    public AsyncHttpClientExample() {
        this.executorService = Executors.newFixedThreadPool(10);
        this.httpClient = HttpClient.newBuilder()
                .connectTimeout(Duration.ofSeconds(10))
                .executor(executorService)
                .build();
    }
    
    public CompletableFuture<String> fetchDataAsync(String url) {
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .timeout(Duration.ofSeconds(30))
                .header("User-Agent", "AsyncHttpClient/1.0")
                .GET()
                .build();
        
        return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .exceptionally(throwable -> {
                    System.err.println("请求失败: " + url + " - " + throwable.getMessage());
                    return "ERROR: " + throwable.getMessage();
                });
    }
    
    public CompletableFuture<List<ApiResponse>> batchFetchData(List<String> urls) {
        List<CompletableFuture<ApiResponse>> futures = urls.stream()
                .map(url -> fetchDataAsync(url)
                        .thenApply(response -> new ApiResponse(url, response))
                        .orTimeout(Duration.ofSeconds(30)))
                .collect(Collectors.toList());
        
        return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
                .thenApply(v -> futures.stream()
                        .map(CompletableFuture::join)
                        .collect(Collectors.toList()));
    }
    
    public CompletableFuture<String> postJsonAsync(String url, String jsonData) {
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .timeout(Duration.ofSeconds(30))
                .header("Content-Type", "application/json")
                .header("Accept", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonData))
                .build();
        
        return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenCompose(response -> {
                    if (response.statusCode() == 200) {
                        return CompletableFuture.completedFuture(response.body());
                    } else {
                        return CompletableFuture.failedFuture(
                                new RuntimeException("HTTP " + response.statusCode() + ": " + response.body()));
                    }
                });
    }
    
    public void shutdown() {
        executorService.shutdown();
    }
    
    public static void main(String[] args) {
        AsyncHttpClientExample client = new AsyncHttpClientExample();
        
        // 单个异步请求示例
        client.fetchDataAsync("https://api.github.com/users/octocat")
                .thenAccept(response -> System.out.println("单个请求结果: " + response.substring(0, 100) + "..."))
                .join();
        
        // 批量异步请求示例
        List<String> urls = List.of(
                "https://api.github.com/users/octocat",
                "https://api.github.com/users/defunkt",
                "https://api.github.com/users/pjhyett"
        );
        
        client.batchFetchData(urls)
                .thenAccept(responses -> {
                    System.out.println("批量请求完成,共 " + responses.size() + " 个响应:");
                    responses.forEach(response -> 
                            System.out.println("URL: " + response.getUrl() + ", 状态: " + 
                                    (response.getData().startsWith("ERROR") ? "失败" : "成功")));
                })
                .join();
        
        client.shutdown();
    }
    
    private static class ApiResponse {
        private final String url;
        private final String data;
        
        public ApiResponse(String url, String data) {
            this.url = url;
            this.data = data;
        }
        
        public String getUrl() {
            return url;
        }
        
        public String getData() {
            return data;
        }
    }
}

案例三:WebSocket实时聊天服务器

此案例展示了如何使用Java WebSocket API构建一个支持多用户的实时聊天应用。

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/chat/{username}")
public class WebSocketChatServer {
    
    private static final CopyOnWriteArraySet<Session> sessions = new CopyOnWriteArraySet<>();
    private static final ConcurrentHashMap<String, String> userSessions = new ConcurrentHashMap<>();
    
    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        sessions.add(session);
        userSessions.put(session.getId(), username);
        
        String joinMessage = String.format("{\"type\":\"system\",\"message\":\"%s 加入了聊天室\",\"timestamp\":\"%s\"}", 
                username, getCurrentTimestamp());
        
        broadcastMessage(joinMessage);
        sendUserList(session);
        
        System.out.println("用户 " + username + " 连接到聊天室");
    }
    
    @OnMessage
    public void onMessage(String message, Session session) {
        String username = userSessions.get(session.getId());
        if (username == null) return;
        
        try {
            ChatMessage chatMessage = parseMessage(message);
            String formattedMessage;
            
            switch (chatMessage.getType()) {
                case "chat":
                    formattedMessage = String.format(
                            "{\"type\":\"chat\",\"username\":\"%s\",\"message\":\"%s\",\"timestamp\":\"%s\"}", 
                            username, escapeJson(chatMessage.getContent()), getCurrentTimestamp());
                    broadcastMessage(formattedMessage);
                    break;
                    
                case "private":
                    String targetUser = chatMessage.getTarget();
                    formattedMessage = String.format(
                            "{\"type\":\"private\",\"from\":\"%s\",\"message\":\"%s\",\"timestamp\":\"%s\"}", 
                            username, escapeJson(chatMessage.getContent()), getCurrentTimestamp());
                    sendPrivateMessage(formattedMessage, targetUser);
                    break;
                    
                default:
                    System.out.println("未知消息类型: " + chatMessage.getType());
            }
        } catch (Exception e) {
            System.err.println("处理消息时出错: " + e.getMessage());
        }
    }
    
    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        String username = userSessions.remove(session.getId());
        sessions.remove(session);
        
        if (username != null) {
            String leaveMessage = String.format(
                    "{\"type\":\"system\",\"message\":\"%s 离开了聊天室\",\"timestamp\":\"%s\"}", 
                    username, getCurrentTimestamp());
            broadcastMessage(leaveMessage);
            
            System.out.println("用户 " + username + " 断开连接: " + closeReason.getReasonPhrase());
        }
    }
    
    @OnError
    public void onError(Session session, Throwable throwable) {
        String username = userSessions.get(session.getId());
        System.err.println("WebSocket错误 (用户: " + username + "): " + throwable.getMessage());
        
        try {
            session.close();
        } catch (IOException e) {
            System.err.println("关闭会话时出错: " + e.getMessage());
        }
    }
    
    private void broadcastMessage(String message) {
        sessions.removeIf(session -> {
            try {
                session.getBasicRemote().sendText(message);
                return false;
            } catch (IOException e) {
                System.err.println("发送消息失败: " + e.getMessage());
                return true;
            }
        });
    }
    
    private void sendPrivateMessage(String message, String targetUsername) {
        sessions.stream()
                .filter(session -> targetUsername.equals(userSessions.get(session.getId())))
                .forEach(session -> {
                    try {
                        session.getBasicRemote().sendText(message);
                    } catch (IOException e) {
                        System.err.println("发送私信失败: " + e.getMessage());
                    }
                });
    }
    
    private void sendUserList(Session session) {
        StringBuilder userList = new StringBuilder("{\"type\":\"userlist\",\"users\":[");
        boolean first = true;
        for (String username : userSessions.values()) {
            if (!first) userList.append(",");
            userList.append("\"").append(username).append("\"");
            first = false;
        }
        userList.append("]}");
        
        try {
            session.getBasicRemote().sendText(userList.toString());
        } catch (IOException e) {
            System.err.println("发送用户列表失败: " + e.getMessage());
        }
    }
    
    private ChatMessage parseMessage(String json) {
        // 简单的JSON解析,实际项目中建议使用Jackson或Gson
        String type = extractJsonValue(json, "type");
        String content = extractJsonValue(json, "message");
        String target = extractJsonValue(json, "target");
        
        return new ChatMessage(type, content, target);
    }
    
    private String extractJsonValue(String json, String key) {
        String pattern = "\"" + key + "\":\"";
        int start = json.indexOf(pattern);
        if (start == -1) return null;
        
        start += pattern.length();
        int end = json.indexOf("\"", start);
        return end != -1 ? json.substring(start, end) : null;
    }
    
    private String escapeJson(String text) {
        return text.replace("\\", "\\\\")
                   .replace("\"", "\\\"")
                   .replace("\n", "\\n")
                   .replace("\r", "\\r");
    }
    
    private String getCurrentTimestamp() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
    }
    
    private static class ChatMessage {
        private final String type;
        private final String content;
        private final String target;
        
        public ChatMessage(String type, String content, String target) {
            this.type = type;
            this.content = content;
            this.target = target;
        }
        
        public String getType() { return type; }
        public String getContent() { return content; }
        public String getTarget() { return target; }
    }
}

案例四:基于Netty的高性能服务器

以下代码展示了使用Netty框架构建高性能网络服务器的实现方式。

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.concurrent.DefaultThreadFactory;

import java.util.concurrent.atomic.AtomicLong;

public class NettyHighPerformanceServer {
    private static final int PORT = 8080;
    private static final AtomicLong connectionCount = new AtomicLong(0);
    private static final AtomicLong messageCount = new AtomicLong(0);
    
    public void start() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1, new DefaultThreadFactory("boss"));
        EventLoopGroup workerGroup = new NioEventLoopGroup(0, new DefaultThreadFactory("worker"));
        
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .option(ChannelOption.SO_REUSEADDR, true)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    .childOption(ChannelOption.TCP_NODELAY, true)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ChannelPipeline pipeline = ch.pipeline();
                            pipeline.addLast(new StringDecoder());
                            pipeline.addLast(new StringEncoder());
                            pipeline.addLast(new BusinessLogicHandler());
                        }
                    });
            
            ChannelFuture future = bootstrap.bind(PORT).sync();
            System.out.println("Netty服务器启动成功,监听端口: " + PORT);
            
            // 启动统计线程
            startStatisticsThread();
            
            future.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
    
    private void startStatisticsThread() {
        Thread statisticsThread = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(10000); // 每10秒打印一次统计信息
                    System.out.println(String.format("统计信息 - 当前连接数: %d, 总消息数: %d", 
                            connectionCount.get(), messageCount.get()));
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        statisticsThread.setDaemon(true);
        statisticsThread.start();
    }
    
    public static void main(String[] args) throws InterruptedException {
        new NettyHighPerformanceServer().start();
    }
    
    private static class BusinessLogicHandler extends ChannelInboundHandlerAdapter {
        
        @Override
        public void channelActive(ChannelHandlerContext ctx) {
            connectionCount.incrementAndGet();
            System.out.println("新连接建立: " + ctx.channel().remoteAddress());
            
            // 发送欢迎消息
            ctx.writeAndFlush("欢迎连接到Netty高性能服务器!\n");
        }
        
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            String message = (String) msg;
            messageCount.incrementAndGet();
            
            // 处理不同类型的消息
            if (message.startsWith("ECHO:")) {
                String echoContent = message.substring(5);
                ctx.writeAndFlush("回显: " + echoContent + "\n");
            } else if (message.startsWith("TIME")) {
                ctx.writeAndFlush("服务器时间: " + System.currentTimeMillis() + "\n");
            } else if (message.startsWith("STATS")) {
                String stats = String.format("服务器统计 - 连接数: %d, 消息数: %d\n", 
                        connectionCount.get(), messageCount.get());
                ctx.writeAndFlush(stats);
            } else {
                ctx.writeAndFlush("未知命令: " + message + "\n");
            }
        }
        
        @Override
        public void channelInactive(ChannelHandlerContext ctx) {
            connectionCount.decrementAndGet();
            System.out.println("连接断开: " + ctx.channel().remoteAddress());
        }
        
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            System.err.println("处理连接时发生异常: " + cause.getMessage());
            ctx.close();
        }
    }
}

这些代码案例展示了Java网络编程在不同场景下的实际应用。第一个案例演示了使用NIO构建高并发服务器的核心技术,第二个案例展示了现代异步HTTP客户端的实现方法,第三个案例提供了WebSocket实时通信的完整解决方案,第四个案例则展现了Netty框架在构建高性能网络应用中的优势。

每个案例都包含了完整的错误处理、资源管理和性能优化考虑,可以直接用于生产环境或作为进一步开发的基础。这些实践案例有助于开发者深入理解Java网络编程的核心概念,并掌握在实际项目中应用这些技术的方法。

你可能感兴趣的:(java,java,网络,php)