2011-05-23 116 views
1

我在Fedora中使用QTcpServer,QTcpSocket與不使用線程來製作簡單的客戶端服務器程序。我想讓我的應用程序獨立於首先運行的客戶端或服務器的順序。當我首先啓動服務器時,我的應用程序運行良好,但我無法讓客戶端等待,而服務器未啓動並連接用作服務器啓動。我用waitForConnection(),但它沒有幫助。 請給出一些建議。QTcpSocket,等待服務器

TcpClient::TcpClient(QWidget *parent) : QMainWindow(parent), 
ui(new Ui::TcpClient) 

{ 
ui->setupUi(this); 
tcpSocket= new QTcpSocket(this); 
tcpSocket->connectToHost(QHostAddress::LocalHost,6178);  
connect(tcpSocket, SIGNAL(connected()), this, SLOT(sendRequest())); 
connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(connectionClosedByServer()));  
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(error())); 
. 
. 
.. 

} 

void TcpClient::error() 

{ 
ui->lStatus->setText(tcpSocket->errorString()); 
closeConnection(); 
tcpSocket->connectToHost(QHostAddress::LocalHost,6178); 
} 

回答

2

在客戶端上,使用connectToHost()。聽取hostFound()connected()獲得成功,並error()失敗。失敗時,只需嘗試再次連接(可能在1至10秒後,使用QTimer::singleShot()。)

這將允許您的應用的其餘部分在嘗試連接時繼續運行。

+0

它的工作原理。如果我在錯誤處理插槽中寫入連接代碼,但安全還是好?我的代碼看起來像是 TcpClient :: TcpClient(QWidget * parent): QMainWindow(parent), ui(new Ui :: TcpClient) ui-> setupUi(this); tcpSocket = new QTcpSocket(this); tcpSocket-> connectToHost(QHostAddress :: LocalHost,6178); – anj 2011-05-23 09:55:08

+0

connect(tcpSocket,SIGNAL(connected()),this,SLOT(sendRequest())); (tcpSocket,SIGNAL(disconnected()),this,SLOT(connectionClosedByServer())); (tcpSocket,SIGNAL(error(QAbstractSocket :: SocketError)),this,SLOT(error())); void TcpClient :: error() ui-> lStatus-> setText(tcpSocket-> errorString()); closeConnection(); tcpSocket-> connectToHost(QHostAddress :: LocalHost,6178); } – anj 2011-05-23 10:03:35

+0

@anjali:Argh。請不要在評論中發佈代碼。閱讀幾乎是不可能的。 :) ...無論如何,我會寫一個名爲'tryConnect()'的插槽,它調用'connectToHost()'。然後,當error()被髮信號(如果錯誤是你只是想重試'),我會使用QTimer :: singleShot()通過計時器發信號通知那個插槽。 – Macke 2011-05-23 11:15:38