我需要创建一个相对简单的Java tcp / ip服务器,我在确定是否应该使用Netty之类的东西或者只是坚持使用简单的ServerSocket和InputStream / OutputStream时会遇到一些麻烦。
我们真的只需要监听请求,然后将新客户端Socket传递给新线程中的某些处理代码。一旦处理完成并发送响应,该线程将终止。
我喜欢Netty中管道,解码器等的想法,但对于这样一个简单的场景,似乎不值得增加前期开发时间。对我们的初始要求来说似乎有点矫枉过正,但我有点紧张,有很多事情我不考虑。如果有的话,Netty对这些简单要求有什么好处?我没有考虑什么?
答案 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层,为您的服务逻辑层进行通信并将它们交换出来。