2014-07-16 184 views
3

我有兩個項目,一個用於服務器,一個用於客戶端。在客戶端上,當我想發送數據時,我創建了一個QTcpSocket成員變量,然後使用write()方法發送數據。從服務器發送數據到客戶端

在服務器上,我收到信息,但我想將信息發送回客戶端。具體來說,我想驗證一個用戶,所以我發送他們在客戶端登錄到服務器的用戶名和密碼,我想檢查保存在服務器上的數據庫的數據,然後發送信息返回給客戶以驗證信息是否正確。

我的問題是,我不知道如何將信息從服務器發送到客戶端。在服務器上,我有兩個成員變量,QTcpServer server;QTcpSocket* client;

我查看了關於QTcpServer的文檔,就我所知,它沒有相當於write(),而QTcpSocket*是當前連接到服務器的客戶端。

我在想在服務器上創建一個QTcpSocket變量,將信息發送給客戶端我將信息發送到服務器以同樣的方式,但是這似乎是錯誤的,因爲這樣的客戶端將表現得像一臺服務器,完成一個QTcpServer變量在客戶端上。

我該怎麼辦呢?

回答

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(); 
    ... 
} 
+0

一旦我使用'serverSocket-> write(「Hello!」)寫入數據;'我如何讀取該客戶端上的數據?使用我在客戶端程序中包含的'readSocket'函數?我已經可以讀取從客戶端發送到服務器的數據,所以我認爲這就是您希望我放置'readSocket'函數的地方。 – Lighthat

+1

在客戶端讀取數據是相似的。只需將客戶端插座的readyRead信號連接到某個插槽即可。當新數據到達時,信號被髮射,槽被調用並且您可以在那裏讀取數據。 – Nejat

+0

我已將兩個變量添加到我的客戶端程序QTcpSocket * incomingFromServer;處理來自服務器和QTcpServer *服務器的數據;監聽來自服務器的傳入連接。每次用戶打開客戶端程序時,我都有一個歡迎函數來向服務器發送消息,並測試此操作我想從服務器獲取消息。因此,在我調用客戶端寫入之後,我調用connect,然後在該端口上偵聽響應,就像我在等待客戶端響應時在服務器上執行的操作一樣。這到目前爲止是否正確? – Lighthat

相關問題