gpt4 book ai didi

java - 这个Netty UDP模型真的是多线程的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:41 31 4
gpt4 key购买 nike

我开发了一个客户端/服务器应用程序,它在 TCP 端口 10000 接收初始连接,协商后,服务器通过将 UDP 套接字绑定(bind)到另一个端口(如 10001)和连接到该房间的客户端来生成游戏室, 应该使用 UDP 连接到这个端口。

这是我创建每个游戏室时运行的代码:

...
EventLoopGroup udpBossGroup = new NioEventLoopGroup(1);
Bootstrap bUdp = new Bootstrap();
bUdp.group(udpBossGroup);
bUdp.handler(new LoggingHandler(LogLevel.INFO));
bUdp.handler(new UDPInitializer());
bUdp.channel(NioDatagramChannel.class);
bUdp.bind(udpPortCounter).sync();
...

我尝试检查 netstat 但它显示相同的进程 ID,可能是父进程 ID:

netstat -lanp
udp6 0 0 :::10024 :::* 26568/java
udp6 0 0 :::10025 :::* 26568/java
udp6 0 0 :::10026 :::* 26568/java

PS 显示相同的 PID 但不同的 LWP,所以我相信他们使用不同的线程:

ps -eLF | grep -i java
UID PID PPID LWP C NLWP SZ RSS PSR STIME TTY TIME CMD
root 26568 4088 26568 0 26 620767 66144 0 10:16 pts/2 00:00:00 java -jar gameserver.jar
root 26568 4088 26569 0 26 620767 66144 0 10:16 pts/2 00:00:00 java -jar gameserver.jar
root 26568 4088 26570 0 26 620767 66144 1 10:16 pts/2 00:00:00 java -jar gameserver.jar
root 26568 4088 26571 0 26 620767 66144 0 10:16 pts/2 00:00:00 java -jar gameserver.jar

问题是:这种模式在 UDP 套接字上真的是多线程的吗(每个套接字都在不同的线程上运行)?

我如何确保它在每个 UDP 套接字上使用不同的线程?

最佳答案

  1. 使用 Thread.currentThread().getId() 打印线程 ID,以确认在编写多线程客户端(或多线程客户端)时在服务器上使用多线程来不断发送数据。
  2. 我发现你只使用了一个 NioEventLoopGroup(1),这意味着只有一个线程用于连接、接收数据等,如果在第 1 步只打印一个线程 ID,试试这个:

    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    b.group(bossGroup, workerGroup)

  3. Netty 使用线程池 (NioDatagramChannel) 处理任务,因此线程可重用以处理不同的套接字数据,“我如何确保它在每个 UDP 套接字上使用不同的线程?”我不建议这样做,因为当很多客户端连接到你的服务器时,它会消耗很多线程,你应该用另一种方式来保证数据线程的安全。

关于java - 这个Netty UDP模型真的是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983978/

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