网络编程基础

发布于:2025-08-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

Java网络编程基础与实践

目录

  1. 网络编程概述
  2. 网络模型与协议
  3. Socket编程基础
  4. TCP编程实践
  5. UDP编程实践
  6. 高级网络编程技术
  7. 网络安全与性能优化
  8. 实战案例
  9. 总结与展望

1. 网络编程概述

网络编程是指编写应用程序,使这些应用程序能够在不同计算机之间进行通信和数据交换的过程。Java作为一种跨平台的编程语言,提供了强大的网络编程API,使得开发者可以方便地开发网络应用程序。

1.1 Java网络编程的特点

  1. 跨平台性:Java的"一次编写,到处运行"特性使得网络程序可以在不同平台上运行。
  2. 丰富的API:Java提供了java.net包,包含Socket、ServerSocket、DatagramSocket等类。
  3. 安全性:Java的安全机制可以保护网络应用程序免受恶意代码攻击。
  4. 高性能:Java的NIO(New I/O)提供了非阻塞I/O,提高了网络程序的性能。

1.2 网络编程的基本概念

  1. IP地址:网络中设备的唯一标识。
  2. 端口:设备上应用程序的标识。
  3. 协议:网络通信的规则,如TCP、UDP等。
  4. 客户端/服务器模型:网络通信的基本模型。

2. 网络模型与协议

2.1 TCP/IP模型

TCP/IP模型是实际应用中最广泛使用的网络模型:

  1. 网络接口层:负责物理连接和数据传输。
  2. 网络层:负责IP寻址和路由。
  3. 传输层:提供TCP和UDP两种传输协议。
  4. 应用层:包含各种应用协议。

2.2 重要协议

2.2.1 TCP协议

TCP(传输控制协议)是一种面向连接的、可靠的传输协议:

  1. 连接建立:通过三次握手建立连接。
  2. 可靠传输:使用序列号、确认应答、重传机制确保数据可靠传输。
  3. 流量控制:通过滑动窗口机制控制发送速率。
  4. 拥塞控制:通过慢启动、拥塞避免等算法防止网络拥塞。
2.2.2 UDP协议

UDP(用户数据报协议)是一种无连接的、不可靠的传输协议:

  1. 无连接:不需要建立连接,直接发送数据。
  2. 不可靠:不保证数据顺序和可靠性。
  3. 高效:开销小,传输速度快。
  4. 适用场景:实时音视频、DNS查询等。
2.2.3 HTTP协议

HTTP(超文本传输协议)是应用层协议,用于Web通信:

  1. 请求/响应模型:客户端发送请求,服务器返回响应。
  2. 方法:GET、POST、PUT、DELETE等。
  3. 状态码:如200(成功)、404(未找到)等。

3. Socket编程基础

Socket是网络编程的API,是网络通信的端点。Java提供了Socket类和ServerSocket类用于TCP通信,以及DatagramSocket类用于UDP通信。

3.1 Socket类

Socket类表示客户端Socket,用于建立与服务器的连接。

3.2 ServerSocket类

ServerSocket类表示服务器Socket,用于监听客户端连接。

3.3 DatagramSocket类

DatagramSocket类用于UDP通信,发送和接收数据报。

3.4 InetAddress类

InetAddress类表示IP地址,可以获取主机名和IP地址。

4. TCP编程实践

4.1 TCP服务器编程

TCP服务器的基本步骤:

  1. 创建ServerSocket,绑定端口。
  2. 调用accept()方法等待客户端连接。
  3. 获取Socket的输入流和输出流。
  4. 与客户端进行数据通信。
  5. 关闭连接。

示例代码:

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

public class TCPServer {
    public static void main(String[] args) {
        int port = 8080;
        
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Server is listening on port " + port);
            
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());
                
                new Thread(new ClientHandler(clientSocket)).start();
            }
        } catch (IOException e) {
            System.out.println("Server exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

class ClientHandler implements Runnable {
    private final Socket clientSocket;
    
    public ClientHandler(Socket socket) {
        this.clientSocket = socket;
    }
    
    public void run() {
        try (InputStream input = clientSocket.getInputStream();
             OutputStream output = clientSocket.getOutputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println("Received from client: " + line);
                output.write(("Server response: " + line).getBytes());
            }
        } catch (IOException e) {
            System.out.println("Server exception: " + e.getMessage());
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4.2 TCP客户端编程

TCP客户端的基本步骤:

  1. 创建Socket,连接服务器。
  2. 获取Socket的输入流和输出流。
  3. 向服务器发送数据。
  4. 接收服务器响应。
  5. 关闭连接。

示例代码:

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

public class TCPClient {
    public static void main(String[] args) {
        String hostname = "localhost";
        int port = 8080;
        
        try (Socket socket = new Socket(hostname, port);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            
            // 发送数据
            out.println("Hello from client");
            
            // 接收响应
            String response = in.readLine();
            System.out.println("Server response: " + response);
            
        } catch (UnknownHostException e) {
            System.out.println("Server not found: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("I/O error: " + e.getMessage());
        }
    }
}

4.3 多线程TCP服务器

上面的TCPServer示例已经使用了多线程处理多个客户端连接。每个客户端连接都会创建一个新的线程来处理,这样可以同时服务多个客户端。

5. UDP编程实践

5.1 UDP服务器编程

UDP服务器的基本步骤:

  1. 创建DatagramSocket,绑定端口。
  2. 创建DatagramPacket用于接收数据。
  3. 接收客户端数据。
  4. 处理数据并发送响应。

示例代码:

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

public class UDPServer {
    public static void main(String[] args) {
        int port = 8080;
        
        try (DatagramSocket socket = new DatagramSocket(port)) {
            System.out.println("UDP Server is listening on port " + port);
            
            byte[] receiveBuffer = new byte[1024];
            
            while (true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
                socket.receive(receivePacket);
                
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Received from client: " + message);
                
                String response = "Server response: " + message;
                byte[] sendData = response.getBytes();
                
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, 
                                                              receivePacket.getAddress(), receivePacket.getPort());
                socket.send(sendPacket);
            }
        } catch (IOException e) {
            System.out.println("Server exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

5.2 UDP客户端编程

UDP客户端的基本步骤:

  1. 创建DatagramSocket。
  2. 创建DatagramPacket发送数据。
  3. 接收服务器响应。
  4. 关闭连接。

示例代码:

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

public class UDPClient {
    public static void main(String[] args) {
        String hostname = "localhost";
        int port = 8080;
        
        try (DatagramSocket socket = new DatagramSocket()) {
            String message = "Hello from client";
            byte[] sendBuffer = message.getBytes();
            
            InetAddress address = InetAddress.getByName(hostname);
            DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, address, port);
            socket.send(sendPacket);
            
            byte[] receiveBuffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
            socket.receive(receivePacket);
            
            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Server response: " + response);
            
        } catch (UnknownHostException e) {
            System.out.println("Server not found: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("I/O error: " + e.getMessage());
        }
    }
}

6. 高级网络编程技术

6.1 Java NIO

Java NIO(New I/O)提供了非阻塞I/O,可以提高网络程序的性能。

6.1.1 核心组件
  1. Channel:通道,类似于流,但双向。
  2. Buffer:缓冲区,数据容器。
  3. Selector:选择器,用于监控多个通道的事件。
6.1.2 NIO服务器示例
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

public NIOServer {
    private Selector selector;
    private ServerSocketChannel serverSocketChannel;
    private final int port;
    
    public NIOServer(int port) {
        this.port = port;
    }
    
    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("Server started on port " + port);
        
        while (true) {
            selector.select();
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> iter = selectedKeys.iterator();
            
            while (iter.hasNext()) {
                SelectionKey key = iter.next();
                
                if (key.isAcceptable()) {
                    handleAccept(key);
                }
                
                if (key.isReadable()) {
                    handleRead(key);
                }
                
                iter.remove();
            }
        }
    }
    
    private void handleAccept(SelectionKey key) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
        SocketChannel socketChannel = serverSocketChannel.accept();
        socketChannel.configureBlocking(false);
        socketChannel.register(selector, SelectionKey.OP_READ);
        System.out.println("New client connected: " + socketChannel.getRemoteAddress());
    }
    
    private void handleRead(SelectionKey key) throws IOException {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        int bytesRead = socketChannel.read(buffer);
        
        if (bytesRead == -1) {
            socketChannel.close();
            return;
        }
        
        buffer.flip();
        byte[] data = new byte[buffer.limit()];
        buffer.get(data);
        String message = new String(data);
        System.out.println("Received from client: " + message);
        
        String response = "Server response: " + message;
        ByteBuffer responseBuffer = ByteBuffer.wrap(response.getBytes());
        socketChannel.write(responseBuffer);
    }
    
    public static void main(String[] args) throws IOException {
        NIOServer server = new NIOServer(8080);
        server.start();
    }
}

6.2 异步I/O

Java 7引入了异步I/O(AIO),进一步提高了网络程序的性能。

6.2.1 AIO服务器示例
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.CountDownLatch;

public AIOServer {
    private final int port;
    
    public AIOServer(int port) {
        this.port = port;
    }
    
    public void start() throws IOException {
        final AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open();
        serverChannel.bind(new InetSocketAddress(port));
        
        System.out.println("Server started on port " + port);
        
        serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
            @Override
            public void completed(AsynchronousSocketChannel socketChannel, Void attachment) {
                // 继续接受新连接
                serverChannel.accept(null, this);
                
                // 处理连接
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                socketChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
                    @Override
                    public void completed(Integer result, ByteBuffer buffer) {
                        buffer.flip();
                        byte[] data = new byte[buffer.limit()];
                        buffer.get(data);
                        String message = new String(data);
                        System.out.println("Received from client: " + message);
                        
                        String response = "Server response: " + message;
                        ByteBuffer responseBuffer = ByteBuffer.wrap(response.getBytes());
                        socketChannel.write(responseBuffer, responseBuffer, new CompletionHandler<Integer, ByteBuffer>() {
                            @Override
                            public void completed(Integer result, ByteBuffer buffer) {
                                // 读取更多数据
                                buffer.clear();
                                socketChannel.read(buffer, buffer, this);
                            }
                            
                            @Override
                            public void failed(Throwable exc, ByteBuffer buffer) {
                                try {
                                    socketChannel.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                    
                    @Override
                    public void failed(Throwable exc, ByteBuffer buffer) {
                        try {
                            socketChannel.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
            
            @Override
            public void failed(Throwable exc, Void attachment) {
                exc.printStackTrace();
            }
        });
        
        // 保持服务器运行
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws IOException {
        AIOServer server = new AIOServer(8080);
        server.start();
    }
}

6.3 Netty框架

Netty是一个高性能的异步事件驱动的网络应用框架,可以简化网络编程。

6.3.1 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;

public NettyServer {
    private final int port;
    
    public NettyServer(int port) {
        this.port = port;
    }
    
    public void start() {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new StringDecoder());
                     ch.pipeline().addLast(new StringEncoder());
                     ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                         @Override
                         protected void channelRead0(ChannelHandlerContext ctx, String message) {
                             System.out.println("Received from client: " + message);
                             String response = "Server response: " + message;
                             ctx.writeAndFlush(response);
                         }
                         
                         @Override
                         public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                             cause.printStackTrace();
                             ctx.close();
                         }
                     });
                 }
             });
            
            ChannelFuture f = b.bind(port).sync();
            System.out.println("Server started on port " + port);
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) {
        NettyServer server = new NettyServer(8080);
        server.start();
    }
}

7. 网络安全与性能优化

7.1 网络安全

  1. SSL/TLS:使用SSL/TLS加密通信数据。
  2. 身份验证:验证通信双方的身份。
  3. 防火墙:限制网络访问,保护系统安全。
  4. 安全协议:使用HTTPS、SSH等安全协议。
7.1.1 SSL/TLS服务器示例
import javax.net.ssl.*;
import java.io.*;
import java.net.*;
import java.security.*;

public SSLServer {
    private final int port;
    
    public SSLServer(int port) {
        this.port = port;
    }
    
    public void start() throws Exception {
        // 加载密钥库
        KeyStore keyStore = KeyStore.getInstance("JKS");
        try (InputStream keyStoreStream = new FileInputStream("server.jks")) {
            keyStore.load(keyStoreStream, "password".toCharArray());
        }
        
        // 初始化KeyManagerFactory
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, "password".toCharArray());
        
        // 初始化SSLContext
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), null, null);
        
        // 创建SSLServerSocket
        SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
        SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
        
        System.out.println("SSL Server started on port " + port);
        
        while (true) {
            try (SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
                 BufferedReader reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
                 PrintWriter writer = new PrintWriter(sslSocket.getOutputStream(), true)) {
                
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println("Received from client: " + line);
                    writer.println("Server response: " + line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        SSLServer server = new SSLServer(8443);
        server.start();
    }
}

7.2 性能优化

  1. 缓冲区管理:合理设置缓冲区大小,减少内存拷贝。
  2. 连接池:复用连接,减少连接建立和关闭的开销。
  3. NIO:使用非阻塞I/O提高性能。
  4. Netty:使用高性能网络框架。

8. 实战案例

8.1 简单聊天室

基于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;

public ChatRoomServer {
    private final int port;
    
    public ChatRoomServer(int port) {
        this.port = port;
    }
    
    public void start() {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new StringDecoder());
                     ch.pipeline().addLast(new StringEncoder());
                     ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                         @Override
                         protected void channelRead0(ChannelHandlerContext ctx, String message) {
                             // 广播消息给所有客户端
                             ctx.channel().writeAndFlush("[Server] " + message + "\n");
                         }
                         
                         @Override
                         public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
                             // 新客户端连接
                             ctx.channel().writeAndFlush("[Server] New client joined: " + ctx.channel().remoteAddress() + "\n");
                         }
                         
                         @Override
                         public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
                             // 客户端断开连接
                             ctx.channel().writeAndFlush("[Server] Client left: " + ctx.channel().remoteAddress() + "\n");
                         }
                         
                         @Override
                         public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                             cause.printStackTrace();
                             ctx.close();
                         }
                     });
                 }
             });
            
            ChannelFuture f = b.bind(port).sync();
            System.out.println("Chat room server started on port " + port);
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) {
        ChatRoomServer server = new ChatRoomServer(8080);
        server.start();
    }
}

8.2 文件传输程序

基于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.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

public FileTransferServer {
    private final int port;
    
    public FileTransferServer(int port) {
        this.port = port;
    }
    
    public void start() {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)));
                     ch.pipeline().addLast(new ObjectEncoder());
                     ch.pipeline().addLast(new SimpleChannelInboundHandler<FileTransfer>() {
                         @Override
                         protected void channelRead0(ChannelHandlerContext ctx, FileTransfer fileTransfer) throws Exception {
                             // 保存文件
                             String filePath = "received_" + fileTransfer.getFileName();
                             try (FileOutputStream fos = new FileOutputStream(filePath)) {
                                 fos.write(fileTransfer.getFileData());
                             }
                             
                             // 发送确认
                             ctx.channel().writeAndFlush(new FileTransfer("File received: " + fileTransfer.getFileName(), null));
                         }
                         
                         @Override
                         public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                             cause.printStackTrace();
                             ctx.close();
                         }
                     });
                 }
             });
            
            ChannelFuture f = b.bind(port).sync();
            System.out.println("File transfer server started on port " + port);
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) {
        FileTransferServer server = new FileTransferServer(8080);
        server.start();
    }
}

class FileTransfer implements Serializable {
    private String fileName;
    private byte[] fileData;
    
    public FileTransfer(String fileName, byte[] fileData) {
        this.fileName = fileName;
        this.fileData = fileData;
    }
    
    public String getFileName() {
        return fileName;
    }
    
    public byte[] getFileData() {
        return fileData;
    }
}

8.3 HTTP服务器

实现一个简单的HTTP服务器:

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.http.*;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public SimpleHttpServer {
    private final int port;
    
    public SimpleHttpServer(int port) {
        this.port = port;
    }
    
    public void start() {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ChannelPipeline p = ch.pipeline();
                     p.addLast(new HttpRequestDecoder());
                     p.addLast(new HttpResponseEncoder());
                     p.addLast(new SimpleChannelInboundHandler<HttpObject>() {
                         @Override
                         protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
                             if (msg instanceof HttpRequest) {
                                 HttpRequest request = (HttpRequest) msg;
                                 String uri = request.uri();
                                 String responseContent;
                                 
                                 if (uri.equals("/")) {
                                     responseContent = "<html><body><h1>Welcome to Simple HTTP Server</h1></body></html>";
                                 } else {
                                     responseContent = "<html><body><h1>404 Not Found</h1></body></html>";
                                 }
                                 
                                 FullHttpResponse response = new DefaultFullHttpResponse(
                                     HttpVersion.HTTP_1_1, 
                                     HttpResponseStatus.OK, 
                                     Unpooled.copiedBuffer(responseContent.getBytes())
                                 );
                                 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8");
                                 response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
                                 
                                 ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
                             }
                         }
                         
                         @Override
                         public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                             cause.printStackTrace();
                             ctx.close();
                         }
                     });
                 }
             });
            
            ChannelFuture f = b.bind(port).sync();
            System.out.println("HTTP Server started on port " + port);
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) {
        SimpleHttpServer server = new SimpleHttpServer(8080);
        server.start();
    }
}

9. 总结与展望

Java网络编程提供了丰富的API和框架,使得开发者可以方便地开发高性能、高可靠性的网络应用程序。本文从Socket编程基础出发,详细介绍了TCP/UDP编程、NIO、异步I/O、Netty框架等内容,并通过实例帮助读者理解Java网络编程的实际应用。

未来,随着云计算、物联网、5G等新技术的发展,网络编程将面临新的挑战和机遇。Java网络编程技术也将不断发展,提供更高效、更安全的网络编程解决方案。作为开发者,我们需要不断学习新技术,适应网络编程的发展趋势,开发出更加优秀的网络应用程序。


网站公告

今日签到

点亮在社区的每一天
去签到