Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中每个连接的线程数与所有连接的一个线程数_Java_Sockets_Nio_Nonblocking_Socketchannel - Fatal编程技术网

java中每个连接的线程数与所有连接的一个线程数

java中每个连接的线程数与所有连接的一个线程数,java,sockets,nio,nonblocking,socketchannel,Java,Sockets,Nio,Nonblocking,Socketchannel,目前我有两种不同类型的服务器和客户端,我正在尝试决定哪一种更适合MMO服务器,或者至少适合一个一次至少有100名玩家的小型MMO服务器 我的第一个服务器使用线程连接模型,并使用ObjectOutputStream通过套接字发送对象 我的第二个服务器使用javanio对所有连接只使用一个线程,并使用select循环它们。此服务器还使用ObjectOutputStream发送数据 对于我的问题,对于MMO服务器来说,什么是更好的方法?如果单线程模型更好,那么通过套接字通道发送对象会受到怎样的影响,它

目前我有两种不同类型的服务器和客户端,我正在尝试决定哪一种更适合MMO服务器,或者至少适合一个一次至少有100名玩家的小型MMO服务器

我的第一个服务器使用线程连接模型,并使用ObjectOutputStream通过套接字发送对象

我的第二个服务器使用javanio对所有连接只使用一个线程,并使用select循环它们。此服务器还使用ObjectOutputStream发送数据

对于我的问题,对于MMO服务器来说,什么是更好的方法?如果单线程模型更好,那么通过套接字通道发送对象会受到怎样的影响,它不会一直被读取,也不会得到完整的对象


对于通过它发送的每个对象,它只包含一个int和两个float,用于发送位置和玩家id。

我将把这个问题与MMO为什么通过TCP使用UDP联系起来。原因是UDP承诺快速交付,而TCP承诺有保证的交付

类似的类比可以应用于单线程模型和多线程模型。无论您选择哪种,您的总体CPU周期都保持不变,即服务器每秒只能处理这么多信息。 让我们看看在这些场景中会发生什么

1.单线程型号: 在这种情况下,您自己的实现或底层库将最终创建一个管道,在该管道中请求开始排队。如果您处于最小负载,队列将保持几乎为空,执行将是实时的,但是可能会浪费大量CPU。在最大负载下,将有一个长的队列,随着负载的增加,执行将有延迟,但交付将得到保证,CPU利用率将达到最佳。通常,一个慢客户机会让其他人慢下来

  • 多线程模型: 在这种情况下,根据您自己的实现或底层库实现多线程的方式,将开始并行执行请求。MT的问题是很容易被愚弄。例如,java.util.concurrent.ThreadPoolExecutor实际上不会执行任何并行处理,除非将队列大小设置为较低的值。一旦并行处理开始发生,在最小负载下,您的执行将是超高速的,CPU利用率将是最佳的,游戏性能将是非常好的。然而,在最大负载下,RAM的使用率将很高,CPU的利用率仍然是最佳的。通常,您需要设置线程中断,以避免慢客户端占用所有线程,这将意味着慢客户端的性能不稳定。此外,当您开始耗尽线程池和资源时,线程要么排队,要么被丢弃,导致性能不稳定

  • 在游戏中,性能比稳定性更重要,因此毫无疑问,您应该尽可能地使用MT,但是,调整线程参数以补充服务器资源将决定这是好事还是坏事,我将把这个问题与MMO为什么使用TCP上的UDP联系起来。原因是UDP承诺快速交付,而TCP承诺有保证的交付

    类似的类比可以应用于单线程模型和多线程模型。无论您选择哪种,您的总体CPU周期都保持不变,即服务器每秒只能处理这么多信息。 让我们看看在这些场景中会发生什么

    1.单线程型号: 在这种情况下,您自己的实现或底层库将最终创建一个管道,在该管道中请求开始排队。如果您处于最小负载,队列将保持几乎为空,执行将是实时的,但是可能会浪费大量CPU。在最大负载下,将有一个长的队列,随着负载的增加,执行将有延迟,但交付将得到保证,CPU利用率将达到最佳。通常,一个慢客户机会让其他人慢下来

  • 多线程模型: 在这种情况下,根据您自己的实现或底层库实现多线程的方式,将开始并行执行请求。MT的问题是很容易被愚弄。例如,java.util.concurrent.ThreadPoolExecutor实际上不会执行任何并行处理,除非将队列大小设置为较低的值。一旦并行处理开始发生,在最小负载下,您的执行将是超高速的,CPU利用率将是最佳的,游戏性能将是非常好的。然而,在最大负载下,RAM的使用率将很高,CPU的利用率仍然是最佳的。通常,您需要设置线程中断,以避免慢客户端占用所有线程,这将意味着慢客户端的性能不稳定。此外,当您开始耗尽线程池和资源时,线程要么排队,要么被丢弃,导致性能不稳定

  • 在游戏中,性能比稳定性更重要,因此毫无疑问,您应该尽可能地使用MT,但是调整线程参数以补充服务器资源将决定这是好事还是坏事

    @Vimal您能解释一下为什么这会更好吗,从我所读到的每连接一个线程不是一个好主意,因为很多线程是一件坏事。现在不是这样了吗?为什么不设置一个压力测试,检查每个备选方案的表现呢?一次100名球员算不了什么。从线程开始,只有在发现问题或经历巨大增长时才切换到NIO。带有选择器的NIO只有在成千上万个连接的情况下才发挥作用,如果有的话,您会发现
    java.net
    版本的编写和维护要简单得多。@YoavGur从我的测试来看,它们似乎都差不多,没有一个比other@Arcxz太