我开发了一个客户端/服务器应用程序,它在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套接字上使用不同的线程?
答案 0 :(得分:0)
Thread.currentThread().getId()
打印线程ID,以确认当您编写多线程客户端(或多个客户端)以不间断地发送数据时,在服务器上使用多线程。我发现你只使用了一个NioEventLoopGroup(1),这意味着只有一个线程可用于连接,接收数据等,如果在STEP 1上只打印一个THREAD ID,请尝试:
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
b.group(bossGroup, workerGroup)
使用线程池(NioDatagramChannel)的Netty进程任务,因此线程可重用以处理不同的套接字数据,"如何确保它在每个UDP套接字上使用不同的线程?&# 34;我不建议这样做,因为当很多客户端连接你的服务器时会花费很多线程,你应该保持数据线程的安全。