gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:01 24 4
gpt4 key购买 nike

我正在尝试从另一台机器创建到基于 java 的套接字服务器的多个客户端连接。服务器和客户端都使用 Netty 4 作为 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();
}
}
}

有人能指出我如何使用 Netty 从客户端创建多个连接,而无需为每个客户端生成新线程。我尝试了一个也是唯一一个在 another post on stack overflow 中找到的类似条件的片段但就此而言,对我而言,在第一次成功连接后执行暂停(进入无限等待状态)。

谢谢

最佳答案

除了两件重要的事情之外,代码看起来是正确的 - 您必须由所有客户端共享 netty 上下文并异步工作。

即在开始时初始化 EvenetLoopGroup 并将此单个实例传递给每个客户端对 Bootstrap.group() 的每次调用。

对于异步方法,避免在 connect() future (不是那么重要)上使用 sync() 并且主要在 close() future 上使用。后者的代码被挂起,直到连接关闭。

关于java - Netty 4 从客户端创建多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33151584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com