Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty 4从客户端创建多个连接_Java_Linux_Multithreading_Netty_Nio - Fatal编程技术网

Java Netty 4从客户端创建多个连接

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

我正在尝试从另一台机器创建到基于java的套接字服务器的多个客户端连接。服务器和客户端都使用Netty4实现NIO。在服务器端,我使用了boss和worker组,它能够在一个linux机器上接收和服务器100000个并发连接(在设置内核参数和ulimit之后)

然而,我最终在客户端为每个连接创建了一个新线程,这导致了JVM线程限制异常

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()。其他所有内容都将在处理程序中异步处理。