gpt4 book ai didi

java - 为什么我应该将 NIO 用于 TCP 多人游戏而不是简单的套接字 (IO) - 或 : where is the block?

转载 作者:太空狗 更新时间:2023-10-29 15:28:40 25 4
gpt4 key购买 nike

我正在尝试为 Android 设备创建一个简单的多人游戏。我一直在考虑网络代码,现在阅读了很多关于套接字的页面。 Android 应用程序将只是一个客户端,并且只连接到一个服务器。

几乎所有地方(这里也是)你都会得到使用 NIO 或使用 NIO 的框架的建议,因为“阻塞”。我试图了解简单套接字实现的问题是什么,所以我创建了一个简单的测试来尝试一下:

我的主要应用:

[...]
Socket clientSocket = new Socket( "127.0.0.1", 2593 );
new Thread(new PacketReader(clientSocket)).start();
PrintStream os = new PrintStream( clientSocket.getOutputStream() );
os.println( "kakapipipopo" );
[...]

PacketReader线程:

class PacketReader implements Runnable
{
Socket m_Socket;
BufferedReader m_Reader;

PacketReader(Socket socket)
{
m_Reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

public void run()
{
char[] buffer = new char[200];
int count = 0;
while(true)
{
count = m_Reader.read(buffer, 0, 200);
String message = new String(buffer, 0, count);
Gdx.app.log("keks", nachricht);
}
}
}

我无法体验到我应该得到的阻塞问题。我认为 read() 函数会阻止我的应用程序,我什么也做不了——但一切正常。我一直在想:如果我只是在我的应用程序中创建一个输入和输出缓冲区,并创建两个线程,它们将从我的两个缓冲区写入和读取套接字,会怎么样?这行得通吗?如果是 - 为什么每个人都推荐 NIO?在正常的 IO 方式中的某个地方肯定会发生阻塞,但我找不到它。使用 NIO 进行 Android 多人游戏还有其他好处吗?我认为 NIO 似乎更复杂,因此可能不太适合移动设备,但简单的套接字方式可能更不适合移动设备。

如果有人能告诉我问题出在哪里,我会很高兴。我不害怕 NIO,但至少我想知道我为什么要使用它 :D

问候

-托马斯

最佳答案

阻塞是,read() 将阻塞当前线程,直到它可以从套接字的输入流中读取数据。因此,您需要一个专用于该单个 TCP 连接的线程。

如果您有超过 10,000 个客户端设备连接到您的服务器怎么办?您至少需要 10k 线程来处理所有客户端设备(假设每个设备都维护一个 TCP 连接),无论它们是否处于 Activity 状态。上下文切换和其他多线程开销太多,即使其中只有 100 个处于 Activity 状态。

NIO 使用选择器模型来处理这些客户端,这意味着您不需要为每个 TCP 连接使用专用线程来接收数据。您只需要选择所有 Activity 连接(已接收到数据)并处理这些 Activity 连接。您可以控制服务器端应维护多少线程。

关于java - 为什么我应该将 NIO 用于 TCP 多人游戏而不是简单的套接字 (IO) - 或 : where is the block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743628/

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