我需要创建一个相对简单的 Java tcp/ip 服务器,但在确定是否应该使用 Netty 之类的东西还是只使用简单的 ServerSocket 和 InputStream/OutputStream 时遇到了一些麻烦。
我们真的只需要监听一个请求,然后将新的客户端 Socket 传递给新线程中的一些处理代码。一旦处理完成并发送响应,该线程将终止。
我喜欢 Netty 中的管道、解码器等的想法,但对于这样一个简单的场景,它似乎不值得增加前期开发时间。对于我们最初的要求来说,这似乎有点矫枉过正,但我有点紧张,因为有很多事情我没有考虑。对于这样简单的需求,Netty 有什么好处(如果有的话)?我没有考虑什么?
最佳答案
Netty 相对于简单地使用流读取和写入套接字的主要优势在于,Netty 支持非阻塞、异步 I/O(使用 Java 的 NIO API);当您使用流从套接字读取和写入时(并且您为从 ServerSocket
接受的每个连接启动一个新线程),您使用的是阻塞同步 I/O。
Netty 方法的可扩展性要好得多,如果您的系统需要能够同时处理许多(数千个)连接,这一点很重要。如果您的系统不需要扩展到许多同时连接,那么使用像 Netty 这样的框架可能不值得。
更多背景信息:线程是操作系统中相对昂贵的资源。每个线程都需要用于堆栈的内存(例如 2 MB 大小)。当您创建数千个线程时,这将消耗大量内存;此外,操作系统对可以创建的线程数有限制。所以你不想为每个接受的连接启动一个新线程。异步 I/O 的想法是将线程与连接分离(没有一对一的关系)。连接的数量可能比线程多得多,并且每当其中一个连接发生某些事件(例如,接收到数据)时,线程池中的一个线程会临时用于处理该事件。
关于java - Netty 相对于基本 ServerSocket 服务器的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8406914/