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

时间:2016-05-02 13:45:10

标签: java linux multithreading netty

我开发了一个客户端/服务器应用程序,它在TCP端口10000上接收初始连接,并且在协商之后,服务器通过将UDP套接字绑定到另一个端口(如10001)和连接到此Room的客户端来生成游戏室。 ,应该使用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 个答案:

答案 0 :(得分:0)

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

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

  3. 使用线程池(NioDatagramChannel)的Netty进程任务,因此线程可重用以处理不同的套接字数据,"如何确保它在每个UDP套接字上使用不同的线程?&# 34;我不建议这样做,因为当很多客户端连接你的服务器时会花费很多线程,你应该保持数据线程的安全。