Netty优于基本ServerSocket服务器的好处?

时间:2011-12-06 21:12:28

标签: java tcp network-programming netty serversocket

我需要创建一个相对简单的Java tcp / ip服务器,我在确定是否应该使用Netty之类的东西或者只是坚持使用简单的ServerSocket和InputStream / OutputStream时会遇到一些麻烦。

我们真的只需要监听请求,然后将新客户端Socket传递给新线程中的某些处理代码。一旦处理完成并发送响应,该线程将终止。

我喜欢Netty中管道,解码器等的想法,但对于这样一个简单的场景,似乎不值得增加前期开发时间。对我们的初始要求来说似乎有点矫枉过正,但我​​有点紧张,有很多事情我不考虑。如果有的话,Netty对这些简单要求有什么好处?我没有考虑什么?

3 个答案:

答案 0 :(得分:55)

Netty优于仅使用流读取和写入套接字的主要优点是Netty支持非阻塞,异步I / O (使用Java的NIO API);当您使用流来从套接字读取和写入时(并为从ServerSocket接受的每个连接启动一个新线程),您正在使用阻塞的同步I / O.

Netty方法可以更好地扩展,如果您的系统需要能够同时处理多个(数千个)连接,这一点非常重要。如果您的系统不需要扩展到多个同时连接,那么使用像Netty这样的框架可能不值得。

更多背景信息:线程是操作系统中相对昂贵的资源。每个线程需要堆栈的内存(例如可以是2 MB的大小)。当你创建数千个线程时,这将耗费大量内存;此外,操作系统对可以创建的线程数量有限制。因此,您不希望为每个接受的连接启动新线程。异步I / O的想法是将线程与连接分离(没有一对一的关系)。可以有多个连接而不是线程,并且只要某个连接上发生某些事件(例如,接收到数据),就会临时使用来自线程池的线程来处理该事件。

答案 1 :(得分:11)

我认为,当需求发生变化并且维护对您的项目来说变得更加复杂时,使用netty的好处不会立竿见影,但实际上会在以后。 Netty带来了对HTTP协议的内在理解,因此您可以提供简单的RESTful Web服务。您还可以选择使用netty提供的异步请求处理作为框架,以便您可以获得更好的性能并为并发请求提供几个数量级的服务。

答案 2 :(得分:6)

首先,编写服务的逻辑,使其独立于您的通信层。

正如Victor Sorokin所说,自己做这件事有一个学习优势。所以用套接字编写它应该是值得的。这将需要较少的努力才能开始,如果它运作良好,那么你就可以参加比赛。

如果您发现以后需要更高的可扩展性/健壮性,可以切换到netty。只需编写一个新的netty层,为您的服务逻辑层进行通信并将它们交换出来。