QTcpSocket,等待服务器

问题描述:

我在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); 
} 

在客户端上,使用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

如果没有Qt :: QueuedConnection连接选项,从连接到error()的插槽中简单调用connectToHost不适用于我。查看Jonas Mauricio Gastal QTcpSocket reconnect after connection lost stay in ConnectingState的文章。 对不起,我的英文。