4.1 案例研究:运输迁移
为了让您了解传输的工作方式,我将从一个简单的应用程序开始,该应用程序不执行任何操作,只接受客户端连接并将Hi!写入客户端。完成之后,它将断开与客户端的连接。我将不介绍此特定实现的详细信息,因为这只是一个示例。
4.1.1 在没有Netty的情况下使用I / O和NIO
为了开始这个案例研究,我将在没有Netty的情况下实现该应用程序。下面的清单显示了使用阻塞输入/输出(I / O)的代码。
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。
最后更新于
这有帮助吗?