Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
C++ 多客户端游戏服务器提示_C++_Multithreading_Qt_Sockets - Fatal编程技术网

C++ 多客户端游戏服务器提示

C++ 多客户端游戏服务器提示,c++,multithreading,qt,sockets,C++,Multithreading,Qt,Sockets,我刚写完一个简单的棋盘游戏来完成我的大学作业。该游戏非常类似于跳棋,玩家2人可以在轮换时移动棋子 我目前的任务是通过游戏服务器和游戏客户端使游戏可以在线玩 我学习了一些关于多线程服务器的在线教程,我有以下两个基本类: class NetWorkServer : public QTcpServer { Q_OBJECT public: explicit NetWorkServer( QObject *parent = 0); void StartServer(); pr

我刚写完一个简单的棋盘游戏来完成我的大学作业。该游戏非常类似于跳棋,玩家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();

};
类网络服务器:公共QTcpServer
{
Q_对象
公众:
显式网络服务器(QObject*parent=0);
void StartServer();
私人:
std::vector\u clientThreads;
受保护的:
无效输入连接(int socketDescriptor);
};
类ClientThread:publicQThread
{
Q_对象
QTcpSocket*插座;
QTcpSocket*pairSocket=nullptr;
int-socketDescriptor;
波尔·伊斯特;
公众:
显式ClientThread(int-ID,QObject*parent=0);
无效运行();
bool-isHost();
信号:
无效错误(QTcpSocket::SocketError SocketError);
公众时段:
void readyRead();
无效断开连接();
};
这是有效的,但在我继续之前,我需要一些提示

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

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

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

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

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

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

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

好的游戏设计要求你已经有了一个
game
类,你需要的是一个专用的服务器来实现一个通信层来驱动游戏。我假设现在你有游戏,输入和图形用户界面挤在一起。您需要将游戏与玩家输入和GUI隔离/抽象/封装,以便让多个客户端向游戏服务器发送用户事件,游戏服务器向多个GUI发送更新,由每个客户端运行

事实上,无论您是否计划制作多人服务器游戏,从一开始就将责任封装到这个级别都是正确的做法。一个好的设计是灵活和强大的,以后进行设计更改是困难的,并且经常会破坏代码

我还建议您实现一种更抽象的通信方式,不管哪一方是连接的,哪一方是连接的。然后,实现播放器和服务器命令是一件简单的事情,这些命令为网络传输序列化,并在接收端反序列化和处理

网络方面,您可以选择两门课程:

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

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

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


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

@ddriver:关于程序员的问题并不比这里更广泛。谢谢你的回答,我的游戏类是孤立的,这不会成为问题。我目前正在努力解决的是客户机-服务器通信问题。我在网上看到的通常是一台服务器向所有客户端发送信息(echo服务器)。但这不是我真正需要的。我需要想办法将两个线程配对在一起,托管的客户端和加入主机的客户端,并以某种方式将它们隔离,因此当Game1中的玩家移动时,我只向这些玩家发送消息,而不是Game2中的玩家。游戏服务器通常有一个端口,一个用于协商的“侦听”端口