Multithreading 国际象棋在线游戏:如何设计服务器

Multithreading 国际象棋在线游戏:如何设计服务器,multithreading,sockets,serversocket,Multithreading,Sockets,Serversocket,我正在网上开发一个国际象棋游戏。 我的想法是让服务器成为数据从一个播放器传输到另一个播放器的地方。 // server while(true) { if(socket.accept()) { create_a_thread(); // handle one player } } 下面是我继续的计划: 当两个玩家连接服务器(使用TCP)时,服务器会为他们创建两个线程。这意味着两个线程需要相互通信。 // server while(true) { i

我正在网上开发一个国际象棋游戏。

我的想法是让服务器成为数据从一个播放器传输到另一个播放器的地方。

// server
while(true)
{
    if(socket.accept())
    {
        create_a_thread(); // handle one player
    }
}
下面是我继续的计划:
当两个玩家连接服务器(使用TCP)时,服务器会为他们创建两个线程。这意味着两个线程需要相互通信。

// server
while(true)
{
    if(socket.accept())
    {
        create_a_thread(); // handle one player
    }
}
但是一个游戏需要两个线程在服务器上?我认为这不是一个好的设计。


我应该如何重新设计我的服务器?

关于概念层的两个想法:

  • 您确定要让所有用户都通过您的服务器吗?为什么不在两个玩家之间进行点对点呢
  • 当通过中央服务器时,两个玩家之间不需要1-1“关系”。您的服务器可以引入一个API,如
    makeMove(Game g,Move m)
    ,其中一个玩家只需将移动推送到服务器,然后服务器就会向该one客户端发送通知
我的意思是:让事情尽可能简单是很重要的。当你建立一个象棋游戏的心理模型时;是的,那么第一个想法就是,即使是您的服务器也需要“两个连接”用户的“游戏”概念。但这并不一定是真的。相反,将服务器视为一个“邮箱”,在其中放置一封信“这是我的下一步”;服务器确保它到达另一个玩家


长话短说:您应该首先确定服务器中的核心职责(如:“接收用户请求”、“处理用户请求”、“发送通知”);然后再研究“多线程”这些问题。

你说得对。每个连接一个线程通常是一个坏主意,尤其是在负载更高的情况下(上下文切换开始变得越来越昂贵)。看一看反应器的模式,然后再读一遍。如果你有特定的语言,可以考虑现有的框架或库。我有一个朋友写过,服务器是用node.js编写的,它是单线程的。:D谢谢你,多谢。我不太明白p2p是如何工作的。如果我是对的,p2p就是让一个玩家作为服务器,另一个作为客户端,这样他们就可以在没有我的服务器帮助的情况下进行通信。但我认为这可能有风险。如果服务器播放器在黑客扫描其端口时正在
accept
ing。。。这有可能吗?如果没有,你能给我一些关于p2p架构的指导吗?你仍然有一个p2p解决方案的服务器:你的对等点连接到服务器;说“我想玩”;然后服务器选择两个客户机,然后它们相互获取IP并开始相互通信。但请注意:如果我们为您做完整的设计,这不是一项免费服务。