Java Netty 4从客户端创建多个连接
我正在尝试从另一台机器创建到基于java的套接字服务器的多个客户端连接。服务器和客户端都使用Netty4实现NIO。在服务器端,我使用了boss和worker组,它能够在一个linux机器上接收和服务器100000个并发连接(在设置内核参数和ulimit之后) 然而,我最终在客户端为每个连接创建了一个新线程,这导致了JVM线程限制异常Java Netty 4从客户端创建多个连接,java,linux,multithreading,netty,nio,Java,Linux,Multithreading,Netty,Nio,我正在尝试从另一台机器创建到基于java的套接字服务器的多个客户端连接。服务器和客户端都使用Netty4实现NIO。在服务器端,我使用了boss和worker组,它能够在一个linux机器上接收和服务器100000个并发连接(在设置内核参数和ulimit之后) 然而,我最终在客户端为每个连接创建了一个新线程,这导致了JVM线程限制异常 import io.netty.bootstrap.Bootstrap; import io.netty.channel.nio.NioEventLoopGrou
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class TelnetClient
{
private Bootstrap b;
private NioEventLoopGroup loopGroup;
private TelnetConnectionInitializer tci;
public static void main(String[] args) throws Exception
{
System.out.println("TelnetClient:main:enter " + args[0]);
TelnetClient tc = new TelnetClient();
String countStr = args[0]; //number of connections to make
int count = Integer.valueOf(countStr);
for (int i=0; i < count; i++)
{
params.add(String.valueOf(i));
Runnable r = new ClientThread(tc);
new Thread(r).start();
}
System.out.println("TelnetClient:main:exit");
}
public TelnetClient()
{
System.out.println("TelnetClient:TelnetClient");
b = new Bootstrap();
loopGroup = new NioEventLoopGroup();
b = b.group(loopGroup);
b = b.channel(NioSocketChannel.class);
tci = new TelnetConnectionInitializer();
}
public void connect(String host, int port) throws Exception {
System.out.println("TelnetClient:connect:enter");
try {
b.handler(tci).connect(host, port).sync().channel().closeFuture().sync();
} finally {
b.group().shutdownGracefully();
}
System.out.println("TelnetClient:connect:exit");
}
}
/// Creating a new thread per connection,
/// Which seems the culprit of JVM exception, but couldn't found a way to implement boss / worker like solution on client side.
class ClientThread implements Runnable
{
TelnetClient myTc;
public ClientThread(TelnetClient tc)
{
myTc = tc;
}
public void run()
{
System.out.println("ClientThread:run");
try
{
myTc.connect("192.168.1.65", 4598); //Server running on different machine in local network
} catch (Exception e)
{
e.printStackTrace();
}
}
}
导入io.netty.bootstrap.bootstrap;
导入io.netty.channel.nio.NioEventLoopGroup;
导入io.netty.channel.socket.nio.NioSocketChannel;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.concurrent.CopyOnWriteArrayList;
公共类TelnetClient
{
私有引导b;
私有NioEventLoopGroup loopGroup;
专用TelnetConnectionInitializer tci;
公共静态void main(字符串[]args)引发异常
{
System.out.println(“TelnetClient:main:enter”+args[0]);
TelnetClient tc=新的TelnetClient();
String countStr=args[0];//要建立的连接数
int count=Integer.valueOf(countStr);
for(int i=0;i
有人能告诉我,我如何使用Netty从客户端创建多个连接,而不必为每个客户端生成新线程。我在中尝试了一个也是唯一一个针对类似情况找到的代码片段,但在那个里,对于我来说,在第一次成功连接之后,执行暂停(进入无限等待状态)
谢谢除了两件重要的事情外,代码看起来是正确的-您必须让所有客户端共享netty上下文并异步工作 例如,在开始时初始化EvenetLoopGroup,并将此单个实例传递给每个客户端对Bootstrap.group()的每次调用
对于异步aproach,请避免在connect()未来(不太重要)上使用sync(),而主要是在close()未来。后者将暂停代码,直到连接关闭。可以启动多少线程实际上取决于您的电脑容量。要么你必须扩展你的RAM,要么在某个时候你必须面对这个问题。这里的问题不在于Netty,而在于它使用的线程模型。如果您想保留当前RAM并接受多个连接,请使用类似Node.js的并发模型。@kazisami,谢谢您的回答。我理解操作系统和硬件施加的最大线程限制。然而,我的问题是如何在使用Netty框架打开NIO套接字连接时明智地使用线程。我认为Netty是事件驱动的,所以它应该提供类似于NodeJS的并发模型。唯一的一件事是,我找不到合适的示例/文档,因此在这里寻找帮助。您尝试过使用连接池吗?@Sudheera我在服务器端使用连接池,但对于客户端,Netty 4似乎不再有用于连接池的boss/worker模型。我不确定,因此寻求帮助以找到一个相同的小工作示例。我将尝试并发布更新的代码。您是否避免了所有这些sync()?注意客户端初始化的最后一个调用必须是connect()。其他所有内容都将在处理程序中异步处理。