java - Netty 相对于基本 ServerSocket 服务器的优势?

标签 java tcp network-programming netty serversocket

我需要创建一个相对简单的 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/

相关文章:

java - 使用 ProxyFactory 实现编程式 Spring AOP

java - 通过套接字传输空字符时出现问题

go - 在 golang 中通过 TCP 套接字发送数百万条短消息

algorithm - 完整加权网络中的社区检测

c++ - Berkeley 套接字 API 与 C++ 网络编程库

java - hibernate.org Bundle "import package"链接到 rt.jar 中的错误包 javax.transaction 而不是 jboss-transaction.jar

java - 从 7.2 移植后的 Liferay 7.3 java.lang.NullPointerException

java - Android应用后退按钮导致 "Force close"

golang 从 net.TCPConn 中以 4 个字节作为消息分隔读取字节

c - 非阻塞 TCP 套接字处理 - 如何在写入套接字之前检测阻塞状态?