4.1 案例研究:运输迁移

为了让您了解传输的工作方式,我将从一个简单的应用程序开始,该应用程序不执行任何操作,只接受客户端连接并将Hi!写入客户端。完成之后,它将断开与客户端的连接。我将不介绍此特定实现的详细信息,因为这只是一个示例。

4.1.1 在没有Netty的情况下使用I / O和NIO

为了开始这个案例研究,我将在没有Netty的情况下实现该应用程序。下面的清单显示了使用阻塞输入/输出(I / O)的代码。

Listing 4.1 Blocking networking without Netty
public class PlainOioServer {
    public void serve(int port) throws IOException {
        final ServerSocket socket = new ServerSocket(port);
        try {
            for(;;) {
                final Socket clientSocket = socket.accept();
                System.out.println(
                        "Accepted connection from " + clientSocket);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream out;
                        try {
                            out = clientSocket.getOutputStream();
                            out.write("Hi!\r\n".getBytes(
                                    Charset.forName("UTF-8")));
                            out.flush();
                            clientSocket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                clientSocket.close();
                            } catch (IOException ex) {
                                // ignore on close
                            }
                        }
                    }
                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这可以正常工作,但是一段时间后,您会发现阻塞处理的规模不足以适合您的用例。您想使用异步网络来处理所有并发连接,但是问题在于API完全不同。如下面的清单所示,您开始重写您的应用程序。

如您所见,即使代码完全相同,代码也完全不同。这只是一个简单的应用程序。考虑移植一些更复杂的东西所需的工作。

考虑到这一点,让我们使用Netty实现相同的应用程序。

4.1.2 通过Netty使用I / O和NIO

首先编写应用程序的阻止版本,但是这次使用Netty作为网络框架,如下面的清单所示。

您可能会注意到,尽管代码本身很紧凑,但它与清单4.1中的代码完全一样。但这只是优点之一。

让我们修改代码,使其异步工作。

4.1.3 实现异步支持

您将看到以下清单中的代码与清单4.3几乎相同。从阻塞模式切换到异步模式仅需更改两行代码即可。

您将OIO传输换为NIO。以下清单以粗体显示了更改的行。

因为Netty为每个传输实现公开相同的API,所以使用哪种实现都没有关系。Netty通过Channel接口及其ChannelPipeline和ChannelHandler公开其操作。

既然您已经看到了Netty的实际应用,那么让我们更深入地研究传输API。

最后更新于

这有帮助吗?