【问题标题】:Sending data from a server to a client从服务器向客户端发送数据
【发布时间】:2014-09-07 16:06:45
【问题描述】:

我有两个项目,一个用于服务器,一个用于客户端。在客户端,当我要发送数据时,我创建一个QTcpSocket成员变量,然后使用write()方法发送数据。

在服务器上,我收到信息,但我想将信息发送回客户端。具体来说,我正在尝试验证用户,因此我将他们在客户端登录时使用的用户名和密码发送到服务器,并且我想根据保存在服务器上的数据库检查该数据,然后发送信息反馈给客户,以验证信息是否正确。

我的问题是我不知道如何将信息从服务器发送到客户端。在服务器上,我有两个成员变量,QTcpServer server;QTcpSocket* client;

我查看了QTcpServer 上的文档,据我所知,它与write() 没有等价物,QTcpSocket* 是当前连接到服务器的客户端。

我正在考虑在服务器上创建一个QTcpSocket 变量,并以与向服务器发送信息相同的方式向客户端发送信息,但这似乎是错误的,因为这样客户端将表现得像一个服务器,完成QTcpServer 客户端上的变量。

我该怎么做呢?

【问题讨论】:

    标签: c++ qt sockets qtcpsocket qtcpserver


    【解决方案1】:

    您应该使用QTcpServer 来接受传入的 TCP 连接。首先调用listen() 等待连接:

    QTcpServer* tcpServer = new QTcpServer();
    
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
    
    if( !tcpServer->listen( QHostAddress::Any, port_no ) )
        qDebug() << "Couldn't listen to port";
    

    每次有新连接可用时,都会发出此信号newConnection。所以我们将信号连接到一个槽中,以获取服务器QTcpSocket对象与客户端进行通信:

    void MyClass::onNewConnection()
    {
        serverSocket = tcpServer->nextPendingConnection();
    
        connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readSocket()));
    }
    

    您现在可以使用write 方法将数据发送到客户端套接字:

    serverSocket->write("Hello!");
    

    并在新数据到达时读取数据:

    void MyClass::readSocket()
    {
        QByteArray data = serverSocket->readAll();
        ...
    }
    

    【讨论】:

    • 使用serverSocket-&gt;write("Hello!"); 写入数据后,如何在该客户端读取数据?使用我在客户端程序中包含的readSocket 函数?我已经可以读取从客户端发送到服务器的数据,所以我假设您希望我将 readSocket 函数放在此处。
    • 在客户端读取数据类似。只需将客户端套接字的 readyRead 信号连接到某个插槽即可。当新数据到达时,信号被发出,插槽被调用,您可以在那里读取数据。
    • 我在客户端程序中添加了两个变量,QTcpSocket* incomingFromServer;处理来自服务器和 QTcpServer* 服务器的数据;侦听来自服务器的传入连接。我有一个问候功能,每次用户打开客户端程序时都会向服务器发送一条消息,为了测试这一点,我想从服务器返回一条消息。因此,在客户端调用 write 之后,我调用 connect,然后在该端口上侦听响应,就像我在服务器上等待客户端响应时所做的那样。到目前为止这是正确的吗?
    • 这是不正确的。您应该只在客户端有一个QTcpSocket,并且只在服务器正在侦听的端口连接到服务器的 ip。 QTcpServer 仅适用于服务器端。服务器侦听特定端口,客户端连接到该端口。所以在客户端只需连接到服务器端口和 ip。
    • 那么如何让客户端等待服务器的响应呢?我是否将 connect(&amp;client, SIGNAL(readyRead()), this, SLOT(someSlot())); 放入 Client 对象的构造函数中?我根本不需要listen
    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多