多客户端游戏服务器提示

时间:2015-10-31 16:58:31

标签: c++ multithreading qt sockets

我刚刚为我的大学作业写了一个简单的棋盘游戏。该游戏非常类似于棋子,其中玩家2的玩家可以在轮流期间移动他们的棋子。

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

我在multiThreaded服务器上关注了一些在线教程,我有这两个裸骨类:

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)?

关于这个主题的任何其他阅读材料也将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

  

匹配2个不同的2个线程的最佳方法是什么   目前在同一个游戏中的客户?

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

良好的游戏设计要求您已经拥有Game课程,您需要做的是使专用服务器实现一层通信来驱动游戏。我现在假设你有游戏,输入和GUI挤在一起。您需要从玩家输入和GUI中隔离/抽象/封装游戏,这样您就可以让多个客户端将用户事件发送到游戏服务器,游戏服务器将更新发送到多个GUI,由每个客户端运行。

事实上,无论你是否打算制作多人游戏服务器游戏,都应该从一开始就具备这种级别的责任限制。一个好的设计是灵活和强大的,稍后进行设计更改是困难的,并且经常会破坏代码。

我还建议您实施更抽象的通信方式,无论哪一方是连接,哪一方是连接。然后,实现播放器和服务器命令是一件简单的事情,它们为网络传输进行序列化,并在接收端进行去实现和处理。

网络方面你可以去两门课程:

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

TCP - 比UDP更可靠,但这带来了一些开销,有一个明显的连接,更好地匹配需要较少频率数据传输的游戏,如回合制游戏,就像你的游戏一样。您只需跟踪所有活动连接并迭代它们以将数据发送到客户端,TCP中没有多播。

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

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