多客户端游戏服务器提示

Multi Client Game Server tips

本文关键字:提示 服务器 游戏 客户端      更新时间:2023-10-16

我刚为大学作业写完一个简单的棋盘游戏。该游戏与跳棋非常相似,玩家2人可以在回合中移动棋子。

我目前的任务是通过游戏服务器和游戏客户端使游戏可以在线玩。

我学习了一些关于多线程服务器的在线教程,我有以下两个基本类:

class NetWorkServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit NetWorkServer( QObject *parent = 0);
    void StartServer();
private:
    std::vector<ClientThread * > _clientThreads;
protected:
    void incomingConnection(int socketDescriptor);
};


class ClientThread : public QThread
{
    Q_OBJECT
    QTcpSocket *socket;
    QTcpSocket * pairSocket = nullptr;
    int socketDescriptor;
    bool _isHost;
public:
    explicit ClientThread(int ID, QObject *parent = 0);
    void run();
    bool isHost();
signals:
    void error(QTcpSocket::SocketError socketerror);
public slots:
    void readyRead();
    void disconnected();
};

这是有效的,但在我继续之前,我需要一些提示。

我希望它的工作方式如下:

  • 玩家可以在服务器上主持游戏,然后他将提供游戏创建的所有参数。

  • 玩家可以加入托管游戏,当然,如果服务器上有托管游戏

这就是我迷失的地方,我该如何从这里开始。匹配当前处于同一游戏中的2个不同客户端的2个线程的最佳方式是什么?我应该为此创建另一个类吗(比如GameSession)?

任何关于这一主题的额外阅读材料也将非常受欢迎。

匹配两个不同线程中的两个线程的最佳方式是什么当前处于同一游戏中的客户端?

这是服务器做的。服务器控制游戏,客户端只不过是发送请求和接收结果。例如,如果您的客户端移动,它只会向服务器发送一个移动命令,服务器会处理该命令,进行移动,并通知客户端移动是为了更新GUI。所有操作都发生在服务器上,服务器同步所有客户端,因此游戏始终只有一个单一状态。

好的游戏设计要求你应该已经有了一个Game类,你需要制作一个专用服务器来实现一层通信来驱动游戏。我想现在你已经把游戏、输入和GUI挤在一起了。您需要将游戏与玩家输入和GUI隔离/抽象/封装,这样您就可以让多个客户端向游戏服务器发送用户事件,游戏服务器向每个客户端运行的多个GUI发送更新。

事实上,无论你是否计划制作一款多人服务器游戏,从一开始就有这种程度的责任封装是正确的做法。一个好的设计是灵活而强大的,以后进行设计更改很困难,而且经常会破坏代码。

我还建议您实现一种更抽象的通信方式,无论哪一边是连接的,哪一边是被连接的。然后,实现播放器和服务器命令是一件简单的事情,它们串行化以用于网络传输,并且在接收端被取消实现和处理。

网络方面,你可以上两门课:

UDP-通常用于快速实时游戏,如第一人称射击游戏。UDP是无连接的,低延迟但不可靠,并且支持多播和广播,因此在Qt中,当您读取UDP数据报时,您可以提供您期望的主机的IP地址和端口。"连接"的协商将通知服务器客户端IP和端口,从那时起,您只能拦截来自这些位置的数据。

TCP-比UDP更可靠,但这会带来一些开销,有一个独特的连接,更适合需要不太频繁数据传输的游戏,比如回合制游戏,就像你的游戏一样。您只需跟踪所有活动连接并对其进行迭代以向客户端发送数据,TCP中没有多播。

在这两种情况下,通常都会通过TCP进行初始连接协商。客户端必须提供服务器IP和端口,一旦建立了协商连接,就会发送建立持久连接所需的数据,并关闭该连接,以便其他客户端可以与服务器进行协商。端口不能"共享"或多路复用,因此在TCP的情况下,服务器将有一个专用于每个活动连接的端口加上协商端口。

客户端连接到服务器侦听端口,并发送一个神奇的数字,基本上说"嘿,我确实是一个想连接到你的客户端",并处理身份验证(如果有的话)。然后,在UDP的情况下,您开始接受来自客户端的IP和端口的数据报,在TCP的情况下服务器可以连接到主机以建立连接,或者通过协商连接发送一个专用端口,客户端可以在该端口建立持久连接。谁发起连接并不重要。