Java 中的套接字最佳实践

Mig*_*ero 6 java sockets multithreading server

用 Java 编写任何类型的 Web 服务器(无论是 Web 服务器、RESTful Web 应用程序还是微服务),您都可以使用 Sockets 在客户端和服务器之间进行双通道通信。使用 commonSocketServerSocketclass 是微不足道的,但由于 Sockets 是阻塞的,您最终会为每个请求创建一个线程。使用此线程系统,您的服务器将完美运行,但无法很好地扩展。另一种方法是通过SocketChannelServerSocketChannel和来使用 Streams Selector,并且显然不像普通的 Sockets 那样简单。

我的问题是:这两个系统中的哪一个用于生产就绪代码?我说的是 Tomcat、Jetty、Sparkjava 等大中型项目?我想他们都使用 Stream 方法,对吗?

Jes*_*per 4

为了使 Web 服务器真正具有可扩展性,您必须使用非阻塞 I/O来实现它- 这意味着您应该以这样的方式实现它:线程在等待 I/O 操作完成时永远不会被阻塞。

\n

线程是相对昂贵的对象。例如,对于每个线程,需要为其调用堆栈分配内存。默认情况下,该大小约为 1 或几 MB。这意味着,如果您创建 1000 个线程,仅所有这些线程的调用堆栈就已经消耗了约 1 GB 内存。

\n

在 na\xc3\xafve 服务器应用程序中,您可以为每个接受的连接(每个客户端)创建一个线程。如果您有许多并发用户,这将无法很好地扩展。

\n

我不知道 Tomcat 和 Jetty 这样的服务器的实现细节,但它们很可能是使用非阻塞 I/O 实现的。

\n

有关Tomcat 中非阻塞 I/O 的一些信息:Understanding the Tomcat NIO Connector

\n

Java 中最著名的非阻塞 I/O 库之一是Netty

\n