从服务器向客户端发送数据

3
我有两个项目,一个是服务器,一个是客户端。在客户端上,当我想要发送数据时,我创建了一个QTcpSocket成员变量,然后使用write()方法发送数据。
在服务器上,我接收到了信息,但是我想向客户端发送信息。具体来说,我正在尝试验证用户,因此我将客户端登录时使用的用户名和密码发送给服务器,并希望检查该数据是否与保存在服务器上的数据库匹配,然后向客户端返回信息以验证信息是否正确。
我的问题是我不知道如何从服务器向客户端发送信息。在服务器上,我有两个成员变量:QTcpServer server;QTcpSocket* client;
我查阅了QTcpServer文档,据我所知,它没有类似于write()的等效方法,而QTcpSocket*则是当前连接到服务器的客户端。
我考虑在服务器上创建一个QTcpSocket变量,并以同样的方式向客户端发送信息,就像我向服务器发送信息一样,但这似乎是错误的,因为那样客户端会像服务器一样运行,包括在客户端上有一个QTcpServer变量。
我应该如何处理?
1个回答

3

您应该使用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->write("Hello!");写入数据后,如何在客户端上读取?使用我在客户端程序中包含的readSocket函数吗?我已经可以读取从客户端发送到服务器的数据,所以我认为您希望我将readSocket函数放在那里。 - ozzymado
1
在客户端读取数据类似。只需将客户端套接字的readyRead信号连接到某个插槽即可。当有新数据到达时,会发出信号,调用相应的插槽,并在那里读取数据。 - Nejat
我已经在我的客户端程序中添加了两个变量,QTcpSocket *incomingFromServer; 用于处理来自服务器的数据和QTcpServer *server; 用于侦听来自服务器的传入连接。我有一个问候函数,每当用户打开客户端程序时都会向服务器发送一条消息,并且为了测试这一点,我想从服务器获得一条消息回复。因此,在我调用客户端的写操作之后,我调用connect,然后在该端口上侦听响应,就像在服务器上等待来自客户端的响应一样。到目前为止,这样正确吗? - ozzymado
1
这不正确。客户端应该只有一个QTcpSocket,并且只连接到服务器正在侦听的端口的IP地址。QTcpServer仅用于服务器端。服务器在特定端口上侦听,客户端连接到它。因此,在客户端上,只需连接到服务器端口和IP即可。 - Nejat
那么我如何让客户端等待服务器的响应呢?我是将 connect(&client, SIGNAL(readyRead()), this, SLOT(someSlot())); 放在客户端对象的构造函数中吗?我根本不需要进行 listen 吗? - ozzymado
看起来那就是答案。我刚刚做了一下,效果非常好。非常感谢! - ozzymado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接